通过url实现文件下载
@Log("下载文件")
@ResponseBody
@RequestMapping(value = "/download", method = RequestMethod.GET)
public R Download(HttpServletResponse response,Long id) {
String fileUrl = fileService.get(id).getUrl();//文件url
String fileName = fileUrl.substring(fileUrl.lastIndexOf("/")+1);//文件名字
response.setHeader("content-type", "application/octet-stream");
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
byte[] buff = new byte[1024];
BufferedInputStream bis = null;
OutputStream os = null;
try {
os = response.getOutputStream();
bis = new BufferedInputStream(new URL(fileUrl).openConnection().getInputStream());
int i = bis.read(buff);
while (i != -1) {
os.write(buff, 0, buff.length);
os.flush();
i = bis.read(buff);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bis != null) {
try {
bis.close();
return R.ok();
} catch (IOException e) {
e.printStackTrace();
return R.error();
}
}
}
return null;
}
经测试,上面的方式,文件下载缺失严重,下面的下载方式没有问题。
@Log("下载文件")
@ResponseBody
@RequestMapping(value = "/download", method = RequestMethod.GET)
public R download(HttpServletRequest request,HttpServletResponse response,Long id) throws ServletException, IOException{
request.setCharacterEncoding("UTF-8");
String fileUrl = fileService.get(id).getUrl();//文件url
String fileName = fileUrl.substring(fileUrl.lastIndexOf("/") + 1);//获取要下载的文件名
//设置响应类型
fileName = URLEncoder.encode(fileName,"UTF-8");
response.setHeader("Content-Disposition","attachment;filename=" + fileName);
response.setContentType("application/force-download");//应用程序强制下载
//读取文件
OutputStream out = response.getOutputStream();
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(fileUrl);
CloseableHttpResponse httpResp = httpclient.execute(httpGet);
try{
HttpEntity httpEntity = httpResp.getEntity();
response.setContentLength((int) httpEntity.getContentLength());
IOUtils.copy(httpEntity.getContent(),out);
return R.ok();
}catch(Exception ex){
httpclient.close();
ex.printStackTrace();
return R.error();
}finally{
out.flush();
out.close();
}
}
R工具类:
import java.util.HashMap;
import java.util.Map;
public class R extends HashMap<String, Object> {
private static final long serialVersionUID = 1L;
public R() {
put("code", 0);
put("msg", "操作成功");
}
public static R error() {
return error(1, "操作失败");
}
public static R error(String msg) {
return error(500, msg);
}
public static R error(int code, String msg) {
R r = new R();
r.put("code", code);
r.put("msg", msg);
return r;
}
public static R ok(String msg) {
R r = new R();
r.put("msg", msg);
return r;
}
public static R ok(Map<String, Object> map) {
R r = new R();
r.putAll(map);
return r;
}
public static R ok() {
return new R();
}
@Override
public R put(String key, Object value) {
super.put(key, value);
return this;
}
}