基于uploadify上传和 servlet 的下载

标签: uploadify 上传 servlet | 发表时间:2013-08-28 16:53 | 作者:superdog007
出处:http://blog.csdn.net

由于工作需要 暂时快速的选定了uploadify作为文件上传插件。至于下载就匆忙的用servlet来实现


首先到uploadify官网下载需要的Js文件


然后需要自己手写一个Js 来调用 uploadify.js 重点只说上传 其他辅助功能方法不细说



$(function() {

    uploadify();
});

var idSeq = 0;
var filename = [];
function uploadify() {
    $("#file_upload")
            .uploadify(
                    {    
                        'height' : 22,
                        'width' : 65,
                        'buttonText' : '添加附件',
                        'swf' : rsc
                                + '/static/jquery-uploaddify/uploadify.swf?ver='
                                + Math.random(),
                        'uploader' : ctx + '/rest/upload/uploadFile?cat=file',
                        'auto' : false,
                        'formData' : {
                            "JSESSIONID" : $("#sessionUID").val() // jssessionid 为了解决火狐下的问题。
                        },
                        'fileSizeLimit' : '1000000KB',
                        'fileTypeExts' : '*.doc; *.jpg; *.rar',
                        'cancelImg' : ctx + '/static/img/uploadify-cancel.png',
                        'uploadLimit' : 10,
                        'onSelect' : function(file) {
                            startUpload();
                        },

                        上传成功后 我自己需要这些返回信息,所以拼了个这种格式的字符串返回,其中夹杂HTML标签是为了显示用
                        'onUploadSuccess' : function(file, data, response) {
                            var result = $.parseJSON(data);
                            var filepatch = encodeURI(result.obj.filepatch);// 数据库保存路径
                            var as = result.obj.fileNames;// 文件名称
                            filename.push(result.obj.filepatch
                                    + result.obj.fileNames);// 在邮件中保存文件路径从文件夹开始
                            $('#file').val(filename.join(","));
                            var updTableHtml = $("#updTable tbody").html();
                            idSeq++;
                            $('#uploadifyTags').addTag(as.substr(15, as.length));
                            updTableHtml += "<tr id='tld"
                                    + idSeq
                                    + "'><td align='left'>"
                                    + as.substr(15, as.length)
                                    + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href='javascript:void(0)'  style='text-decoration:none;' onclick=deleteTR('"
                                    + 'tld' + idSeq + "','" + filepatch + "','"
                                    + as + "')>删除</a></td></tr>";
                            $("#updTable tbody").html(updTableHtml);
                        },
                    });
}
function startUpload() {
    console.debug($('#file_upload'));
    $('#file_upload').uploadify('upload', '*');
}


功能需要的删除方法,不细说,
function deleteTR(id, patch, filename) {
    $("#" + id).remove();
    $.post(ctx + '/rest/upload/deleteFile?path=' + patch + filename
            + "&cat=file");
    console.debug(path+"|"+filename);
}


然后是上传前台页面- 其实就是一个简单的控件。updtable table 是用来显示用户已经上传的文件,显示 的是上面uploadify.js 中onUploadSuccess 函数返回的那段字符串

<tr>
                <td colspan="2" align="left"><input id='sessionUID' value='<%=session.getId()%>' type="hidden" /> <input type="file"
                    name="uploadify" id="file_upload" />
<!--                     <input type="text" class="tags" id="uploadifyTags"> -->
                    <table id="updTable">
                        <tr>
                        </tr>
                    </table>
                    </td>
            </tr>


最后面是 java代码 因为我这里是公用的一个上传方法,所以保存路径是作为参数获取的,每个模块的保存路径都不同,不需要的话写死了就行 ,为了不使上传后的文件命名重复,保存路径的文件夹用时间命名,上传文件 在文件名前又拼接了时间 截取到秒 来命名。显示的时候再截取掉就可以了

@RequestMapping("/uploadFile")
//    @RolesAllowed(AuthorityDefine.ROLE_USER)    //为解决火狐下jsessionid问题,因为这里我用了spring security 如果设置权限 则无法调用上传方法
    @ResponseBody
    public ReturnObject uploadFile(String cat,HttpServletRequest request,
            HttpServletResponse response) throws IOException{
        
        String basePath = Global.BASE_UPLOAD_FOLDER; //获取基础路径
        String propValue = Global.getProp().getProperty("upload.path." + cat);//获取对应文件夹
        if (StringUtils.isBlank(propValue)){ throw new InvalidParameterException(
                "cat参数错误,没有找到[upload.path." + cat + "]的配置"); }
        
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)request;
        Map<String,MultipartFile> fileMap = multipartRequest.getFileMap();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
        SimpleDateFormat sp = new SimpleDateFormat("yyyyMMdd");
        String ctxPath = basePath + "/" + propValue + File.separator+sp.format(new Date())+"/";//完整路径
        String ctxPathView = sp.format(new Date()) + "/";// 用于在数据库存储的路径-从文件夹开始
        String ymd = sdf.format(new Date());
        // 如果不存在,创建文件夹
        File file = new File(ctxPath);
        if (!file.exists()){
            file.mkdirs();
        }
        ReturnObject ro = new ReturnObject();
        String fileNames = "";
        for (Map.Entry<String,MultipartFile> entity : fileMap.entrySet()){
            MultipartFile mf = entity.getValue();
            String fileName = mf.getOriginalFilename();
            fileName = ymd + "_" + fileName;
            File uploadFile = new File(ctxPath + fileName);
            try{
                FileCopyUtils.copy(mf.getBytes(),uploadFile);
                fileNames += fileName + ",";
            }
            catch (IOException e){
                e.printStackTrace();
                ro.setSuccess(false);
                ro.setMsg(e.getMessage());
                return ro;
            }
        }
        if (fileNames.endsWith(",")){
            fileNames = fileNames.substring(0,fileNames.length() - 1);
        }
        ro.setSuccess(true);
        ro.setMsg("上传文件成功");
        HashMap<String,Object> hsfiled = new HashMap<String,Object>();
        hsfiled.put("fileNames",fileNames);
        hsfiled.put("filepatch",ctxPathView);//数据库保存路径(从时间开始截取的)
        ro.setObj(hsfiled);
        return ro;
    }



附件下载---------------------------------------------------------------------------------------------------

首先前台简单,

<div data-options="region:'east',border:true" style="overflow: hidden; padding: 5px; width:250px">
            <label><font size="2" ><b>附件下载区</b></font></label>
            <hr>
            <table id="downfile">
            <tr></tr>
            </table>
            </div>


  var row = $('#messageDG').datagrid('getSelected');

    if (row.file !=0 && row.file !=null) {
            var updTableHtml = $("#downfile tbody").html();
            var arry = row.file.split(",");
            for ( var i = 0; i < arry.length; i++) {

                updTableHtml += "<tr><td>"
                        + arry[i].substr(24, arry[i].length)
                        + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href='"
                        + rsc
                        + "/rest/upload/download?path="
                        + arry[i]
                        + "&cat=file' style='text-decoration:none;'> 下载</a></td></tr>";
            }
            $("#downfile tbody").html(updTableHtml);

        }


java代码

    @RequestMapping("/download")
    @RolesAllowed(AuthorityDefine.ROLE_USER)
    public void download(String path,String cat,HttpServletRequest request,
            HttpServletResponse response){
        try{
            File file = new File(Global.BASE_UPLOAD_FOLDER+"/"+ cat+"/"+path);
            String filename = file.getName();
            InputStream fis = new BufferedInputStream(new FileInputStream(file));
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();
            response.reset();
            response.addHeader("Content-Disposition","attachment;filename="
                    + new String(filename.getBytes("utf-8"),"ISO-8859-1"));
            response.addHeader("Content-Length","" + file.length());
            response.setContentType("application/octet-stream");
            OutputStream toClient = new BufferedOutputStream(
                    response.getOutputStream());
            toClient.write(buffer);
            toClient.flush();
            toClient.close();
        }
        catch (IOException ex){
            ex.printStackTrace();
        }
    }


PS: 上传提到了删除,附加删除代码

    @RequestMapping("/deleteFile")
    @RolesAllowed(AuthorityDefine.ROLE_USER)
    @ResponseBody
    public ReturnObject deleteFile(String path,String cat){
        ReturnObject ro = new ReturnObject();
        String removePath = Global.BASE_UPLOAD_FOLDER+"/"+ cat+"/"+path;
        File file = new File(removePath);
        if (file.isFile() && file.exists()){
            file.delete();
            ro.setMsg("删除成功");
            ro.setSuccess(true);
        }
        else{
            ro.setMsg("删除失败");
            ro.setSuccess(false);
        }
        return ro;
    }

作者:superdog007 发表于2013-8-28 16:53:35 原文链接
阅读:0 评论:0 查看评论

相关 [uploadify 上传 servlet] 推荐:

基于uploadify上传和 servlet 的下载

- - CSDN博客推荐文章
由于工作需要 暂时快速的选定了uploadify作为文件上传插件. 至于下载就匆忙的用servlet来实现. 首先到uploadify官网下载需要的Js文件. 然后需要自己手写一个Js 来调用 uploadify.js 重点只说上传 其他辅助功能方法不细说.                         'buttonText' : '添加附件',.

Springmvc+uploadify实现文件上传

- - ITeye博客
          Springmvc+uploadify实现文件上传.    网上看了很多关于文件上传的帖子,众口不一,感觉有点乱,最近正好公司的项目里用到JQuery的uploadify控件做文件上传,所以整理下头绪,搞篇文档出来,供亲们分享.    Uploadify控件的主要优势是可以实现批量文件上传,并且提供了onSelect(选中文件)、onUploadSuccess(上传成功回调函数)等多个事件监听函数,可以操控上传的整个流程.

jQuery无刷新上传之uploadify简单试用

- - 博客园_首页
      先简单的侃两句:貌似已经有两个月的时间没有写过文章了,不过仍会像以前那样每天至少有一至两个小时是泡在园子里看各位大神的文章. 前些天在研究“ajax无刷新上传”方面的一些插件,用SWFUpload实现了无刷新上传的功能,不过个人觉得不是很完美.      昨天在网上找到了一个叫做uploadify的jquery上传插件,看到园子里有几篇文章也是介绍这个插件的,心想何不用这个试试.

java版-JQuery上传插件Uploadify使用实例

- - Web前端 - ITeye博客
'folder' : 'uploads',//您想将文件保存到的路径. 'queueID' : 'fileQueue',//与下面的id对应. 'fileDesc' : 'rar文件或zip文件',. 'fileExt' : '*.rar;*.zip', //控制可上传文件的扩展名,启用本项时需同时声明fileDesc.

使用Uploadify实现上传图片生成缩略图例子,实时显示进度条

- - 博客园_首页
不了解Uploadify的,先看看前一篇详细说明. Uploadify简单说来,是基于Jquery的一款文件上传插件. 支持单文件或多文件上传,可控制并发上传的文件数. 在服务器端支持各种语言与之配合使用,诸如PHP,.NET,Java……. 通过参数可配置上传文件类型及大小限制. 通过参数可配置是否选择文件后自动上传.

Servlet Filter 学习

- - CSDN博客架构设计推荐文章
最近在研究CAS , CAS 中的Servlet Filter 不太熟悉, 所以花了点时间学下了下这部分的知识, 分成以下几部分 学习. Servlet Filter  的功能和用法. Servlet Filter 顺序的注意事项. A filter is an object that performs filtering tasks on either the request to a resource (a servlet or static content), or on the response from a resource, or both.

Servlet、Filter和Listener

- - Web前端 - ITeye博客
Java Servlet是与平台无关的服务器端组件,运行于Servlet容器中(如Tomcat),Servlet容器负责Servlet和客户端的通信以及调用Servlet的方法,Servlet和客户端的通信采用“请求/响应”的模式. Servlet可完成以下功能:. 1、创建并返回基于客户请求的动态HTML页面.

Servlet:实现多个文件上传,上传中文文件乱码解决办法

- - CSDN博客Web前端推荐文章
首先,建议将编码设置为GB2312,并在WEB-INF\lib里导入:commons-fileupload-1.3.jar和commons-io-2.4.jar,可百度下下载,然后你编码完成后,上传时可能会遇到"servlet Bad version number in .class file"错误.

Servlet – 会话跟踪

- - ImportNew
HTTP本身是 “无状态”协议,它不保存连接交互信息,一次响应完成之后即连接断开,下一次请求需要重新建立连接,服务器不记录上次连接的内容.因此如果判断两次连接是否是同一用户, 就需要使用 会话跟踪技术来解决.常见的会话跟踪技术有如下几种:. URL重写: 在URL结尾附加. 会话ID标识,服务器通过会话ID识别不同用户..

servlet的四种响应

- - CSDN博客推荐文章
        在一个servlet的请求中,响应的方式的通常有四式,response.getWriter(),response.getOutputStream(),. request.getRequestDispatcher("ajax.jsp").forward(request, response) 和 response.sendRedirect("ajax.jsp").