SpringMVC+Ajax文件批量上传和下载

今天做了文件的上传下载,小小总结一下,基本的web项目建立及SpringMVC框架搭建此处不详细写出来了。

上传form:

<form id="uploadfiles" enctype="multipart/form-data">
       <input type="file" multiple="multiple" id="file_upload" name="file_upload" />
       <input type="button" value="上传" οnclick="upload()" />

</form>

上传Ajax:

<script type="text/javascript">
/*
 * 上传文件
 */
function upload(){
    var formData = new FormData($( "#uploadfiles" )[0]);
     $.ajax({
            type: "post",
            url: "./path/upload",
            dataType: "json",
            data: formData,
            /**   
             *必须false才会自动加上正确的Content-Type   
             */  
            contentType : false,
            /**   
             * 必须false才会避开jQuery对 formdata 的默认处理   
             * XMLHttpRequest会对 formdata 进行正确的处理   
             */
            processData : false,
            success: function(data){//从后端返回数据进行处理
              if(data){
                  alert("上传成功!");
              }else{
                  alert("上传失败!");
              }
            },
            error: function(err) {//提交出错
                $("#msg").html(JSON.stringify(err));//打出响应信息
                alert("服务器无响应");
              }
          });
}
</script>

spring.xml配置加上:

<!-- 配置文件上传 -->
    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 默认编码 -->
        <property name="defaultEncoding" value="utf-8" />
        <!-- 文件大小最大值 -->
        <property name="maxUploadSize" value="10485760000" />
        <!-- 内存中的最大值 -->
        <property name="maxInMemorySize" value="40960" />
    </bean>

controller:

/*
     * 上传多个文件
     */
    @RequestMapping(value = "/upload", produces = "application/json;charset=UTF-8")
    public @ResponseBody
    boolean uploadFiles(@RequestParam("file_upload") MultipartFile [] files) {
        boolean result = false;
        String realPath;
        for(int i=0;i<files.length;i++){
            if (!files[i].isEmpty()) { 

                   String uniqueName=files[i].getOriginalFilename();//得到文件名

                    realPath="E:"+File.separator+uniqueName;//文件上传的路径这里为E盘
                 
                    files[i].transferTo(new File(realPath));   // 转存文件
                    result = true;          
                } catch (Exception e) {  
                    e.printStackTrace();  
                }  
            }
        }
        return result;
    }

下载的jsp页面代码根据需求不同自己设计,这里给出controller代码:

/*
     * 下载多个文件
     */
    @RequestMapping(value = "/download")
    public void downloadFiles(HttpServletResponse response) {
        String str= request.getParameter("rows");//下载文件信息,包括文件名、存储路径等
        JSONArray path=(JSONArray) JSONArray.parse(request.getParameter("rows"));
        Path paths[]=new Path[path.size()];
        paths = JSONArray.parseArray(str, Path.class).toArray(paths);
        String uri = "d:"+ File.separator + "mldn.zip";//临时文件存储路径
        File zipFile = new File(uri) ;   // 定义压缩文件名称  
        ZipOutputStream zipOut = null;// 声明压缩流对象  
        InputStream input = null;
        //将要压缩的文件加入到压缩输出流中
        try {
            zipOut = new ZipOutputStream(new FileOutputStream(zipFile));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        for(int i = 0;i<paths.length;i++){
            File file = new File(paths[i].getUri()+File.separator+paths[i].getFilename());
            try {
                input = new FileInputStream(file) ;// 定义文件的输入流
                zipOut.putNextEntry(new ZipEntry(file.getName())) ; // 设置ZipEntry对象  
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        //将文件写入到压缩文件中
        int temp = 0 ;  
        try {
            while((temp=input.read())!=-1){ // 读取内容  
                zipOut.write(temp) ;    // 写到压缩文件中
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                input.close() ;
                zipOut.close() ;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        try {
            // 以流的形式下载文件。
            BufferedInputStream fis = new BufferedInputStream(new FileInputStream(zipFile));
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();
            // 清空response
            response.reset();
            OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/x-msdownload;");  
            response.setHeader("Content-Disposition", "attachment;filename=" + zipFile.getName());
            toClient.write(buffer);
            toClient.flush();
            toClient.close();
            zipFile.delete();        //将生成的服务器端文件删除
        }
        catch (IOException ex) {
            ex.printStackTrace();
        }   
    }

将多个文件打成一个压缩包下载,然后将生成的临时压缩文件删除。

下载页面如果用Ajax提交请求的话要注意:ajax函数的返回类型只有xml、text、json、html等类型,没有“流”类型,所以我们要实现ajax下载,不能够使用相应的ajax函数进行文件下载。但可以用js生成一个form,用这个form提交参数,并返回“流”类型的数据。

例子:

function download(){
       var form=$("<form>");//定义一个form表单
       form.attr("style","display:none");
       form.attr("target","");
       form.attr("method","post");
       form.attr("action","./path/download");//请求url
       var input1=$("<input>");
       input1.attr("type","hidden");
       input1.attr("name","rows");//设置属性的名字
        input1.attr("value",“test”);//设置属性的值
        $("body").append(form);//将表单放置在web中
        form.append(input1);
        form.submit();//表单提交            
                            }



  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
java 基于springMVC多图片上传,MySQL源码 @Controller @RequestMapping("/upload") public class UploadFileController { @Autowired private UploadFileService uploadFileService; @RequestMapping("/upfile") public String upload(HttpServletRequest request, @RequestParam("designation") String designation, @RequestParam("remark") String remark, //@RequestParam("file") String file, Model model)throws Exception { String str = designation; String[] st=str.split(","); //以逗号为分隔符进行截取 String re = remark; String[] stre = re.split(","); UploadFile uploadFile = new UploadFile(); //转成文件上传请求 MultipartHttpServletRequest murequest = (MultipartHttpServletRequest)request; //在文件上传请求中获取文件,根据file的name List files = murequest.getFiles("image"); if( files !=null && files.size()>0) { for(int i=0; i<files.size(); i++) { String uuid = UUID.randomUUID().toString().replace("-", "").toUpperCase()+"_"; String filename = files.get(i).getOriginalFilename(); //System.out.println("filename="+filename); int hCode =filename.hashCode(); String hex = Integer.toHexString(hCode); String mkdir = hex.charAt(0)+"\\"+hex.charAt(1)+"\\"; String path = request.getServletContext().getRealPath("/images/")+mkdir; //System.out.println("path="+path); File filepath = new File(path,filename); if(!filepath.getParentFile().exists()) { filepath.getParentFile().mkdirs(); } //将上传文件保存到目标文件中 files.get(i).transferTo(new File(path+File.separator+filename)); //获取数据库存储路径 String root = request.getContextPath(); String mkdirsql = hex.charAt(0)+"/"+hex.charAt(1)+"/"; String sqlpath = root+"/images/"+mkdirsql+filename; String imgpath = sqlpath; //图片保存到数据库的路径 uploadFile.setDesignation(st[i]); uploadFile.setRemark(stre[i]); uploadFile.setFile(filename); uploadFile.setImgpath(sqlpath); uploadFileService.addUploadFile(uploadFile); } return "success"; } return "404"; }
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值