springboot 文件上传下载及图片显示,正确编码方式,网上很多示例已过时

原创
2017/12/11 10:03
阅读数 6.1K

最近在开发icec开源项目,在做文件上传下载时,在网上找了下相关示例,但都不如意,很多文章都还是多年前的,互相引用,复制粘贴。

下面分享下我的实现方式和代码。

1、先说上传:

基本条件:form表单要加上enctype="multipart/form-data"    表单中包含

<input type="file"   name="file" >

后端接受文件代码:controller:

@RequestParam("file") MultipartFile multiFile

接收到multiFile ,讲文件保存到指定的目录,可以用

String filePath="c:/temp";//要保存的目录

String newfilename="abc.aaa";//文件名,一版我们用uuid,防止文件名称重复,导致覆盖

Path path=Paths.get(filePath,newfilename);//filePath

Files.copy(multiFile.getInputStream(),path);//

这样上传就完成了。

 

2、再说下载

下载的时候,一般我们的业务里面应该保存了要下载的文件路径。那么问题就变成了怎么根据路径去读取文件并返回到浏览器。下面这段是网上普遍的一个例子。

 byte[] buffer = new byte[1024];
            FileInputStream fis = null; //文件输入流
            BufferedInputStream bis = null;
            
            OutputStream os = null; //输出流
            try {
                os = response.getOutputStream();
                fis = new FileInputStream(file); 
                bis = new BufferedInputStream(fis);
                int i = bis.read(buffer);
                while(i != -1){
                    os.write(buffer);
                    i = bis.read(buffer);
                }
                
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

其实有更简单的写法:

response.setHeader("content-type", "application/octet-stream");
		response.setContentType("application/octet-stream");
		response.setHeader("Content-Disposition", "attachment;fileName=" +  URLEncoder.encode(sysFile.getFileName()) );
		OutputStream os = null; //输出流
		try {
			os = response.getOutputStream();
			Resource resource=  resourceLoader.getResource("file:" + Paths.get(filePath, path));
			IOUtils.copy(resource.getInputStream(), os);
			os.flush();
			
		} catch (IOException e) {
			logger.error("下载文件异常",e);
		}finally {
			if(os!=null) {
				try {
					os.close();
				} catch (IOException e) {
					logger.error("关闭文件流异常",e);
				}
			}
		}

核心是用了spring的ResourceLoader 去加载文件,在利用IOUtils工具,2行代码就实现了。

3、再看图片显示

图片是要在浏览器直接显示,不是下载。作为img标签的src中,显示图片

 HttpHeaders headers = new HttpHeaders();
	            headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
	            headers.add("Content-Disposition", "inline;filename=\"" + URLEncoder.encode(sysFile.getFileName()) + "\"");
	            headers.add("Pragma", "no-cache");
	            headers.add("Expires", "0");
            return ResponseEntity
                    .ok()
                    .headers(headers)
                    .contentLength(resource.contentLength())
                    .contentType(MediaType.parseMediaType(sysFile.getFileType()))
                    .body(new InputStreamResource(resource.getInputStream()));

 

完整代码,请查看我的开源项目icec.

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
2 收藏
0
分享
返回顶部
顶部