Java文件单个上传及批量上传,文件下载,SSM框架

单个文件上传:

1.添加Apache文件上传jar包:

首先需要下载两个apache上传文件的jar包

commons-fileupload-1.3.1.jar

commons-io-2.4.jar

2.配置MultipartResolver处理文件:

SpringMVC 用的是 的MultipartFile来进行文件上传 所以我们首先要配置MultipartResolver:用于处理表单中的file。

spring-mvc.xml中配置

<bean id="multipartResolver"
   class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
   p:defaultEncoding="UTF-8" p:maxUploadSize="62914560"
   p:maxInMemorySize="4096"
   p:uploadTempDir="upload/temp"
   >
</bean>

3.编写文件上传控制器:

@RequestMapping(value="/add",method=RequestMethod.POST)
public String add(Emp emp,MultipartFile file_photo,HttpServletRequest request) throws IOException{
    if(file_photo != null &&  !file_photo.isEmpty()){
        if(file_photo.getSize() > 2*1024*1024){
            throw new RuntimeException("文件大小要大于2M");
        }
        File path =  new File(request.getServletContext().getRealPath("/images"));
        if(path == null){ new File(path).mkdirs();}
        String ext =     file_photo.getOriginalFilename().substring(file_photo.getOriginalFilename().lastIndexOf("."));
        if(".jpg.png.jpeg.gif".indexOf(ext) == -1){
            throw new RuntimeException("文件名称后缀不符合要求");
        }

        String filename = UUID.randomUUID().toString()+ext;
// 通过MultipartFile的transferTo(File dest)这个方法来直接转存文件到指定的路径

        file_photo.transferTo(new File(path+"/"+filename));
        //FileUtils.copyInputStreamToFile(file_photo.getInputStream(), new File(path+"/"+file_photo.getOriginalFilename()));
    }
    emp.setPhoto(file_photo.getOriginalFilename());       //获取上传文件的文件名
    service.add(emp);
    return "redirect:list";
}

 

4.文件上传表单:

<form class="form-horizontal" action="${pageContext.request.contextPath}/resource/add"

method="post" enctype="multipart/form-data">

选择文件:<input type="file" name="file_photo"> //file_photo对应方法中的参数

<input type="submit" value="提交"/>

</form>

 注意要在form标签中加上enctype=”multipart/form-data”表示该表单是要处理文件的

 

                                                                                                                              

 

多个文件上传:

1.添加Apache文件上传jar包:

首先需要下载两个apache上传文件的jar包

commons-fileupload-1.3.1.jar

commons-io-2.4.jar

2.配置MultipartResolver处理文件:

SpringMVC 用的是 的MultipartFile来进行文件上传 所以我们首先要配置MultipartResolver:用于处理表单中的file。

spring-mvc.xml中配置

<bean id="multipartResolver"
   class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
   p:defaultEncoding="UTF-8" p:maxUploadSize="62914560"
   p:maxInMemorySize="4096"
   p:uploadTempDir="upload/temp"
   >
</bean>

3.文件上传控制器 

(1)相同文件类型

@RequestMapping(value = "uploadFiles", method = RequestMethod.POST)
public ModelAndView uploadFile(@RequestParam("files") MultipartFile[] files) {
    //判断file数组不能为空并且长度大于0
    if (files != null && files.length > 0) {
        //循环获取file数组中得文件
        for (int i = 0; i < files.length; i++) {
            MultipartFile file = files[i];
            if(file.getSize() > 2*1024*1024){
                throw new RuntimeException("文件大小要大于2M");
            }
            File path =  new File(request.getServletContext().getRealPath("/images"));
            if(path == null){ path.mkdirs();}
            String ext =  file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
            if(".jpg.png.jpeg.gif".indexOf(ext) == -1){
                throw new RuntimeException("文件名称后缀不符合要求");
            }
            String filename = UUID.randomUUID().toString()+ext;
            // 通过MultipartFile的transferTo(File dest)这个方法来直接转存文件到指定的路径
            file.transferTo(new File(path+"/"+filename));
        }
    }
    //跳转视图
    return new ModelAndView("uploadSuccess","msg",files.length+"个文件");
}

(2)不同文件类型

@RequestMapping(value = "/uploadFiles",method = RequestMethod.POST)
public ModelAndView add(MultipartFile[] files, Resource r, HttpServletRequest request) throws IOException{
    System.out.println("文件长度"+files.length+"----"+files);
    if(files == null || files.length == 0){return new ModelAndView("add_resource","msg","请上传图片和资源");}
    //判断是否有未上传文件
    if(files[0].isEmpty() && files[1].isEmpty()){

return new ModelAndView("add_resource","msg","请上传图片和资源");

}
    if(files[0].isEmpty()){return new ModelAndView("add_resource","msg","请上传图片");}
    if(files[1].isEmpty()){return new ModelAndView("add_resource","msg","请上传资源文件");}
    for (int i = 0; i < files.length; i++) {//文件所在下标按标签从上至下
        //图片处理
        if(i==0){
            if(files[i].getSize() > 1*1024*1024){throw new RuntimeException("文件大小要小于1M");}//判断文件大小
            File path =  new File(request.getServletContext().getRealPath("/images")); //获取Tomcat文件路径
            if(!path.exists()){path.mkdirs();}//如文件夹不存在则创建
            //获取图片后缀名
            String ext = files[i].getOriginalFilename().substring(files[i].getOriginalFilename().lastIndexOf("."));
            if(".jpg.png.jpeg.gif".indexOf(ext) == -1){
                throw new RuntimeException("图片名称后缀不符合要求");
            }
            String filename = UUID.randomUUID().toString()+ext;//图片文件名称
            files[i].transferTo(new File(path+"/"+filename));//转存文件到指定的路径
            r.setPicture(filename);
            continue;
        }
        //资源处理
        if(files[i].getSize() > 5*1024*1024){throw new RuntimeException("文件大小要小于5M");}//判断文件大小
        File path =  new File(request.getServletContext().getRealPath("/source")); //获取Tomcat文件路径
        if(!path.exists()){path.mkdirs();}//如文件夹不存在则创建
        

// 获取资源文件后缀名
        String ext = files[i].getOriginalFilename().substring(files[i].getOriginalFilename().lastIndexOf("."));
        if(".txt.sql.html".indexOf(ext) == -1){
            throw new RuntimeException("资源文件名称后缀不符合要求");
        }
        String filename = UUID.randomUUID().toString()+ext;//图片文件名称
        files[i].transferTo(new File(path+"/"+filename));//转存文件到指定的路径
        r.setFileName(filename);
        r.setFileSize(files[i].getSize());
    }
    Member m = (Member) request.getSession().getAttribute("m");
    r.setUploadTime(new Date());
    r.setMember(m);
    service.add(r);
    return new ModelAndView("redirect:/member/login");
}

4.多个文件上传表单:

<form class="form-horizontal" action="${pageContext.request.contextPath}/uploadFiles"

method="post" enctype="multipart/form-data">

选择文件:<input type="file" name="files">

选择文件:<input type="file" name="files"> //files对应方法中的参数

<input type="submit" value="提交"/>

</form>

前端表单,多个文件组使用同一个name名称:files,后台控制器使用 MultipartFile[] files 数组来接收

注意要在form标签中加上enctype=”multipart/form-data”表示该表单是要处理文件的

                                                                                                                              

扩充:

1>MultipartFile常用方法

 

打印方法结果:

1>文件类型值,MultipartFile.getContentType():image/jpeg

2>表单中文件组件对应name值,MultipartFile.getName():file

3>文件原始名称包括后缀名,MultipartFile.getOriginalFilename():IMEI_20171204.jpg

4>文件大小单位为k,MultipartFile.getSize():27128

5>文件是否为空,MultipartFile.isEmpty():false

2>Apache文件相关jar包常用方法

 

1>FilenameUtils.concat(basePath, fullFileName):用于拼接目录和文件名为文件全路径,且会根据系统对应使用相应的分隔符

2>FileUtils.copyURLToFile(URL source, File destination, int connectionTimeout, int readTimeout):

从指定的url下载文件,保存到destination为准;同时指定连接超时时长,读取文件超时时长。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

文件下载

1.控制器编写

@Login
    @RequestMapping(value="/downfile")
    public void downfile(String fname, HttpServletRequest request, HttpServletResponse response){
            //设置头信息进行下载文件
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/x-msdownload");//需要弹出保存框
            response.setHeader("Content-Disposition" //Content-Disposition是头信息
                    , "attachment;filename*=UTF-8''" + URLEncoder.encode(fname,"UTF-8"));
            //下载文件的路径
            String path = "D:\\IDEA\\MyCSDN\\src\\main\\webapp\\files\\"+fname;
            System.out.println(path+"--");
            OutputStream os = response.getOutputStream();
            InputStream in = new FileInputStream(path);
            FileUtil.copyStream(in,os);
            os.flush();
            os.close();
          }

2.页面编写

<a href="${pageContext.request.contextPath}/downfile?fname=bbs.xls">下载</a>

案例(通常不会按文件名查找而是按ID查到,如积分不足作相应的异常处理)

<a href="${pageContext.request.contextPath}/downfile/${r.id}">下载</a>

@RequestMapping(value="/downfile/{id}")
    public String downfile(@PathVariable("id")Integer id, HttpServletRequest request, HttpServletResponse response){
        try {
            Resource r = service.findOne(id);
            Member m = (Member) request.getSession().getAttribute("m");
            int result = service.isDown(m.getId(),r);
            System.out.println("结果:"+result);

//            if(result ==-1){return null;}//不能下载积分不足
            //设置头信息进行下载文件
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/x-msdownload");//需要弹出保存框
            response.setHeader("Content-Disposition" //Content-Disposition是头信息
                    , "attachment;filename*=UTF-8''" + URLEncoder.encode(r.getFname(),"UTF-8"));
            //下载文件的路径
            String path = "D:\\IDEA\\MyCSDN\\src\\main\\webapp\\files\\"+r.getFileName();
            System.out.println(path+"--");
            OutputStream os = response.getOutputStream();
            InputStream in = new FileInputStream(path);
            FileUtil.copyStream(in,os);
            os.flush();
            os.close();
            r.setDownCount(r.getDownCount()+1);
            service.edit(r);//下载完毕后增加下载次数
            if(result == 1){    //如不是作者或已下载过,执行加减积分
                service.changeScore(m.getId(),r);
            }
            return null;
        }catch (NotScoreRuntimeException ex){
            return "redirect:/resource/add";
        }catch (IOException ex){
            return  null;
        }catch (Exception ex){
            return null;
        }
    }

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值