直接貼代碼:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
@RestController
@RequestMapping()
public class FileController {
/**
* 下載文件
*
* @param request
* @param response
* @return
*/
@RequestMapping(value = "fileDownload")
public String fileDownload(HttpServletRequest request, HttpServletResponse response) {
// 文件名稱
String fileName = request.getParameter("fileName");
// urlencode
try {
// 避免出現文件名稱中文亂碼的情況
fileName = URLEncoder.encode(fileName, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
// TODO
}
// 文件
File file = new File("D:/upload/" + fileName);
// 文件是否存在
if (file.exists()) {
response.setContentType("application/force-download");
response.setCharacterEncoding("UTF-8");
// 這裏可以重置文件名,比如fileName=aa.jpeg,那麼下載下來的文件名稱即爲aa.jpeg
response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
byte[] buffer = new byte[1024];
FileInputStream fis = null; //文件輸入流
BufferedInputStream bis = null;
OutputStream os = null; //輸出流
try {
os = response.getOutputStream();
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
int i = bis.read(buffer);
while(i != -1){
os.write(buffer);
i = bis.read(buffer);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
bis.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} else {
return "";
}
// 這裏返回null。不返回null的話,文件下載成功,但是運行日誌裏有異常
return null;
}
}
其它說明:這裏返回值爲null是有原因的。
因爲我自己也沒理解透徹,下面的可以直接忽略。
個人認爲導致的原因:
響應請求的本質是向外輸出流,流輸出完,即表示響應完成,整個請求處理完成
可以想想剛接觸servlet的時候,我們是怎麼輸出內容的