上一篇我们分析了Java Web中的上传开发: Java上传下载完全解析(一) ,今天我们研究一下Java Web的下载与文件位置配置信息在开发与生产环境中的切换方法。
一、文件下载
文件下载其实非常简单,首先我们根据请求的信息得到文件的名称,然后根据文件位置进行拼接得到具体的文件路径。然后我们只需要在HttpServletResponse中得到文件的输出流,并从文件系统中读取信息放到输出流即可。
在工程中,首先我们会有一个文件的基础地址信息,比如为/data/dev,那么我在上传一个xx.txt文件时,上传时我会先得到其后缀,然后生成一个随机的文件名并加上其后缀,比如7eec46bcc65a21cbe293726eaa9175cf.txt,那么其最终地址为/data/dev/7eec46bcc65a21cbe293726eaa9175cf.txt,这样,上传时就将其保存到此路径下。
同样的道理,下载的时候,需要告诉我需要下载的文件名为7eec46bcc65a21cbe293726eaa9175cf.txt,这样就可以得到其路径为/data/dev/7eec46bcc65a21cbe293726eaa9175cf.txt,然后就可以得到文件流并进行下载了。
还有一点需要注意的是,假如我们下载的时候,假设地址为http://localhost:8080/download/xxx.txt,那么下载的地址前缀即为http://localhost:8080/download/,所以在上传的时候,得到文件名后,需要给客户端返回此文件的下载路径,比如文件名为7eec46bcc65a21cbe293726eaa9175cf.txt,那么返回给客户端的下载路径即为http://localhost:8080/7eec46bcc65a21cbe293726eaa9175cf.txt。
下面贴代码,注意@RequestMapping("/download/{fileName:.+}")中最后必须加入.+,否则.txt .xml这些后缀是获取不到的:
@RequestMapping("/download/{fileName:.+}")
public void download(@PathVariable String fileName, HttpServletRequest request, HttpServletResponse response) throws Exception {
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
//获取下载文件露肩
String downLoadPath = filePath + fileName;
//获取文件的长度
long fileLength = new File(downLoadPath).length();
//设置文件输出类型
response.setHeader("Content-disposition", "attachment; filename="
+ new String(fileName.getBytes("utf-8"), "ISO8859-1"));
//设置输出长度
response.setHeader("Content-Length", String.valueOf(fileLength));
//获取输入流
bis = new BufferedInputStream(new FileInputStream(downLoadPath));
//输出流
bos = ne