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;
}
}