文件下载的时候要保证客户端弹出的保存框中的文件名不出现乱码,并且文件类型正确。
后台代码如下:
@RequestMapping(value = “/api/{sessionid}/documents/download/{documentid}”)
public void download(@PathVariable(“sessionid”)String sessionID,
@PathVariable(“documentid”)String docID,
HttpServletRequest request,
HttpServletResponse response) throws UnsupportedEncodingException{
response.setCharacterEncoding("utf-8");
request.setCharacterEncoding("utf-8");
if ((docID == null || docID.length() == 0)) return;
try{
Document doc = docService.findByID(docID);
if (doc == null) {
return ;
}
String filepath = doc.getSavePath();
String mimetype = doc.getMimeType();
String fileName = doc.getFullName();
if (filepath == null || filepath == "") return;
String str = fileName + "." +StringUtils.getFilenameExtension(filepath);
byte[] ss = str.getBytes("GBK");
String filename = new String(ss,"ISO_8859_1");
//得到客服端输出的输出流
OutputStream outputStream = response.getOutputStream();
//输出文件用的字节数组,每次向输出流发送600个字节
byte b[] = new byte[1024];
//要下载的文件
File fileload = new File(filepath);
//客服端使用保存文件的对话框
response.setHeader("Content-disposition", "attachment;filename=" + filename +"");// URLEncoder.encode(filename, "UTF-8"));
response.setContentType(mimetype);
//通知客服文件的长度
long fileLength = fileload.length();
String length = String.valueOf(fileLength);
response.setHeader("Content_length", length);
//读取文件,并发送给客服端下载
FileInputStream inputStream = new FileInputStream(fileload);
int n = 0;
while ((n = inputStream.read(b)) != -1) {
outputStream.write(b, 0, n);
}
outputStream.flush();
outputStream.close();
inputStream.close();
} catch(RuntimeException e){
logger.error(e.getMessage(), e.fillInStackTrace());
} catch(Exception e){
logger.error(e.getMessage() , e.fillInStackTrace());
}
}
以上通过对文件名编码,使得前端保存文件的对话框显示的文件名是正常的。
byte[] ss = str.getBytes("GBK");
String filename = new String(ss,"ISO_8859_1");
response.setHeader("Content-disposition", "attachment;filename=" + filename +"");
这里的乱码显示主要是由于中文造成的,将中文件进行如上的转码即可。
对于文件类型,如果知道文件类型,就如下声明文件类型:
response.setContentType(mimetype);
如果不知道就设置成自动识别,不过不能保证对所有格式的文件都能正确识别:
response.setContentType("multipart/form-data");
对于前台就非常简单了,只要向以上的api发送一个get请求即可,最简单的就是使用超链接:
<a href='api/" + sessionId + "/documents/download/" + item.id+
"'>" + item.fullName +"</a>
保证href是文件下载的API,点击超链接的时候就会向这个api发送get请求,弹出保存文件的对话框(对于有些浏览器,比如Chrome就自动下载),实现文件下载。