Loading...
墨滴

HelloZK

2021/05/12  阅读:55  主题:自定义主题1

SpringMVC文件上传下载

1. 文件上传

  1. 提供一个上传文件的表单
<form action="uploadUrl" method="post" enctype="multipart/form-data">
    <input type="file" name="filename" multiple="multiple">
    <input type="submit" value="文件上传">
</form>

multiple属性可以实现多文件上传

  1. 配置文件上传解析器
<!--配置文件上传解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
      <!--设置请求编码-->
      <property name="defaultEncoding" value="UTF-8"/>
</bean>
  1. 编写文件上传的方法
@Controller
public class FileUploadController {
    @RequestMapping("/fileUpload")
    public String handleFormUpload(@RequestParam("name") String name, @RequestParam("uploadfile") List<MultipartFile> uploadfile, HttpServletRequest request) {
        if (!uploadfile.isEmpty() && uploadfile.size() > 0) {
            // 循环输出上传的文件
            for (MultipartFile file : uploadfile) {
                // 获取上传文件的原始名称
                String originalFilename = file.getOriginalFilename();
                // 设置上传文件的保存目录
                String dirPath = request.getServletContext().getRealPath("/upload/");
                File filePath = new File(dirPath);
                // 如果保存文件的地址不存在,就先创建目录
                if (!filePath.exists()) {
                    filePath.mkdirs();
                }
                // 使用UUID重新命名上传的文件名称
                String newFilename = name + "_" + UUID.randomUUID() + "_" + originalFilename;
                try {
                    // 使用MultipartFile接口的方法完成文件上传到指定位置
                    file.transferTo(new File(dirPath + newFilename));
                } catch (Exception e) {
                    e.printStackTrace();
                    return "error";
                }
            }
            return "success";
        } else {
            return "error";
        }
    }

2. 文件下载

  1. 提供一个文件下载超链接
<a href="${pageContext.request.contextPath}/download?filename=itheima.jpeg">文件下载</a><br/>
  1. 编写文件下载的方法
@Controller
public class FileDownloadController {
    @RequestMapping("/download")
    public ResponseEntity<byte[]> fileDownload(HttpServletRequest request, String filename) throws Exception {
        // 指定要下载的文件所在路径
        String path = request.getServletContext().getRealPath("/upload/");
        // 创建该文件对象
        File file = new File(path + File.separator + filename);
        // 设置响应头
        HttpHeaders headers = new HttpHeaders();
        // 通知浏览器以下载的方式打开文件
        headers.setContentDispositionFormData("attachment", filename);
        // 定义以流的形式下载返回文件数据
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        // 使用StringMVC框架的ResponeEntity对象封装返回下载数据
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.OK);
    }
}

3. 中文名称的文件下载

  1. 在下载页面对中文文件名编码
<a href="${pageContext.request.contextPath}/download?filename=<%=URLEncoder.encode("中文.jpeg","UTF-8")%>">
    中文名称文件下载
</a><br/>
  1. 在下载方法中增加对文件名进行编码的方法
    // 对文件名编码,防止中文文件乱码
    filename=this.getFilename(request,filename);
// 根据浏览器的不同进行编码设置,返回编码后的文件名
    public String getFilename(HttpServletRequest request,String filename) throws Exception {
        // IE不同版本User-Agent中出现的关键词
        String[] IEBrowserKeyWords = {"MSIE","Trident","Edge"};
        // 获取请求头代理信息
        String userAgent = request.getHeader("User-Agent");
        for (String keyWord:IEBrowserKeyWords){
            // IE内核浏览器,统一为UTF-8编码显示
            return URLEncoder.encode(filename,"UTF-8");
        }
        // 火狐等其他浏览器统一为ISO-8859-1编码显示
        return new String(filename.getBytes("UTF-8"),"ISO-8859-1");
    }

HelloZK

2021/05/12  阅读:55  主题:自定义主题1

作者介绍

HelloZK