package com.sniper.springmvc.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class FileDownloadAction extends RootAction {
private String getFileName(String filePath)
throws UnsupportedEncodingException {
String fileName = filePath.substring(filePath.lastIndexOf("/") + 1);
String Agent = request.getHeader("User-Agent");
if (null != Agent) {
Agent = Agent.toLowerCase();
if (Agent.indexOf("firefox") != -1) {
fileName = new String(fileName.getBytes(), "iso8859-1");
} else if (Agent.indexOf("msie") != -1) {
fileName = URLEncoder.encode(fileName, "UTF-8");
} else {
fileName = URLEncoder.encode(fileName, "UTF-8");
}
}
return fileName;
}
/**
* 需要通过 redirect:download 传递文件路径或者文件类型
*
* @param path
* @param type
* @return
* @throws IOException
*/
@ResponseBody
@RequestMapping(value = "download")
public ResponseEntity<byte[]> download(
@RequestParam(value = "path") String path,
@RequestParam(value = "type", required = false, defaultValue = "application/vnd.ms-excel") String type)
throws IOException {
String fileName = getFileName(path);
HttpHeaders headers = new HttpHeaders();
byte[] body = null;
HttpStatus httpState = HttpStatus.NOT_FOUND;
File file = new File(path);
if (file.exists() && file.isFile()) {
InputStream is = new FileInputStream(file);
body = new byte[is.available()];
is.read(body);
is.close();
headers.add("Content-Type", type);
headers.add("Content-Length", "" + body.length);
headers.add("Content-Disposition", "attachment;filename="
+ fileName);
httpState = HttpStatus.OK;
}
ResponseEntity<byte[]> entity = new ResponseEntity<>(body, headers,
httpState);
return entity;
}
}