我正在尝试向我的网络应用添加一项功能,让用户下载excel文件。
我尝试使用以下代码实现此目的:
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) {
File file = new File("d:/test/test.xls");
response.setContentType("application/xls");
response.addHeader("Content-Disposition", "attachment; filename=test.xls");
response.setContentLength((int) file.length());
try {
FileInputStream fileInputStream = new FileInputStream(file);
OutputStream responseOutputStream = response.getOutputStream();
int bytes;
while ((bytes = fileInputStream.read()) != -1) {
responseOutputStream.write(bytes);
}
fileInputStream.close();
responseOutputStream.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我可以使用上面的代码下载excel文件,但文件已损坏。如果我用microsoft excel打开它,我会弹出一条消息:
"文件格式和扩展名不匹配。该文件可能已损坏或不安全"。
excel文件为空。
运行代码后,原始文件(d:/test/test.xls)也会损坏。
我做错了什么?
答案 0 :(得分:2)
Excel文件.xls
的官方MIME类型为application/vnd.ms-excel
,而.xlsx
为application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
。
此外,我建议在关闭response.reset()
之前写入输出流responseOutputStream.flush()
(重要)之前执行response
。
答案 1 :(得分:0)
尝试以下代码:
File file = null;
InputStream in = null;
OutputStream outstream = null;
try {
response.reset();
in = new FileInputStream(file);
response.setContentType("application/vnd.ms-excel");
response.addHeader("content-disposition", "attachment; filename=data.xls");
outstream = response.getOutputStream();
IOUtils.copyLarge(in, outstream);
}
catch (Exception e) {
out.write("Unable to download file");
}finally {
IOUtils.closeQuietly(outstream);
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);
if (file != null)
file.delete();
}
不要忘记在依赖项中添加apache commons-io-2.4