|
本文参考《精通Spring:JavaWeb开发技术详解》,作者:孙卫琴,清华大学出版社出版
把服务器端的文件发送到客户端,这个过程称为文件下载。在Spring MVC框架中,
org.springframework.http.ResponseEntity.BodyBuilder接口具有文件下载的功能。BodyBuilder接口提供了生成响应结果的各种方法:
(1)body(T body) :返回表示响应结果的ResponseEntity对象。
2)contentLength(long contentLength) :设置响应正文的长度。
(3)contentType(MediaType contentType) :设置响应正文的类型。
(4)header(String headerName, String... headerValues) :设置响应头中的特定项。
在本范例中,FileController类的download()方法通过BodyBuilder接口来下载文件:Java@RequestMapping("/download")
public ResponseEntity<byte[]>
download(
HttpServletRequest request,String filename,
@RequestHeader("User-Agent") String userAgent)
throws IOException {
//下载文件的路径
String path= request.getServletContext().getRealPath("/mydata");
//创建表示下载文件的File对象
File file =new File(path + File.separator + filename);
//创建用于生成响应结果的BodyBuilder对象,响应状态代码为200
ResponseEntity.BodyBuilder builder = ResponseEntity.ok();
//设置响应正文长度
builder.contentLength(file.length());
//设置响应正文类型application/octet-stream二进制数据流,
//这是最常见的文件下载类型
builder.contentType(MediaType.APPLICATION_OCTET_STREAM);
// 使用URLEncoding.decode对文件名进行解码
filename =URLEncoder.encode(filename, "UTF-8");
// 根据浏览器类型,决定"Content-Disposition"响应头的值
if(userAgent.indexOf("MSIE") > 0) {
builder.header("Content-Disposition",
"attachment;filename=" + filename);
} else {
builder.header("Content-Disposition",
"attacher;filename*=UTF-8''" + filename);
}
//返回包含下载文件数据的响应结果
return builder.body(getBytesFromFile(file));
}
/** 把文件中的内容读入到一个字节数组中 */
private byte[] getBytesFromFile(File file)throwsIOException{
FileInputStream fileInputStream = new FileInputStream(file);
//获取文件大小
intlength=fileInputStream.available();
//读取文件字节,存放在字节数组中
intbytesRead=0;
byte[]buff=new byte[length];
while(bytesRead<length) {
intresult=
fileInputStream.read(buff,bytesRead,length-bytesRead);
if(result==-1)
break;
bytesRead+=result;
}
fileInputStream.close();
return buff;
} |
FileController类的download()方法的filename参数就表示需要从服务器端下载的文件名字。
download()方法通过BodyBuilder对象来生成包含下载文件数据的响应结果,它的响应正文的类型为
MediaType.APPLICATION_OCTET_STREAM,实际取值为“application/octet-stream”。
浏览器端收到这样的响应结果,会把服务器端的特定图片文件中的数据下载到客户端。
程序猿的技术大观园:www.javathinker.net
|
|