mvc实例详解java_Spring MVC的文件下载实例详解

spring mvc的文件下载实例详解

读取文件

要下载文件,首先是将文件内容读取进来,使用字节数组存储起来,这里使用spring里面的工具类实现

import org.springframework.util.filecopyutils;

public byte[] downloadfile(string filename) {

byte[] res = new byte[0];

try {

file file = new file(backup_file_path, filename);

if (file.exists() && !file.isdirectory()) {

res = filecopyutils.copytobytearray(file);

}

} catch (ioexception e) {

logger.error(e.getmessage());

}

return res;

}

这个数组就是文件的内容,后面将输出到响应,供浏览器下载

下载文件的响应

下载文件的响应头和一般的响应头是有所区别的,而这里面还要根据用户浏览器的不同区别对待

我把生成响应的代码封装成了一个方法,这样所有下载响应都可以调用这个方法了,避免重复代码到处写

protected responseentity downloadresponse(byte[] body, string filename) {

httpservletrequest request = ((servletrequestattributes) requestcontextholder

.getrequestattributes()).getrequest();

string header = request.getheader("user-agent").touppercase();

httpstatus status = httpstatus.created;

try {

if (header.contains("msie") || header.contains("trident") || header.contains("edge")) {

filename = urlencoder.encode(filename, "utf-8");

filename = filename.replace("+", "%20"); // ie下载文件名空格变+号问题

status = httpstatus.ok;

} else {

filename = new string(filename.getbytes("utf-8"), "iso8859-1");

}

} catch (unsupportedencodingexception e) {}

httpheaders headers = new httpheaders();

headers.setcontenttype(mediatype.application_octet_stream);

headers.setcontentdispositionformdata("attachment", filename);

headers.setcontentlength(body.length);

return new responseentity(body, headers, status);

}

这里需要注意,一般来说下载文件是使用201状态码的,但是ie浏览器不支持,还得我花了很大力气才找出来是那个问题

其中对文件名的处理是为了防止中文以及空格导致文件名乱码

控制器方法

在控制器的那里需要对返回值进行处理

@requestmapping(value = "/download-backup", method = requestmethod.get)

@responsebody

public responseentity downloadbackupfile(@requestparam string filename) {

byte[] body = backupservice.downloadfile(filename);

return downloadresponse(body, filename);

}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

希望与广大网友互动??

点此进行留言吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值