我曾尝试开发一个允许用户下载文件的servlet,但它允许用户下载文件,但文件内容包含二进制垃圾而不是人类可读的。我可以知道可能是什么原因吗?
代码
int length = -1, index = 0;
byte[] buffer = null;
String attachmentPath = null, contentType = null, extension = null;
File attachmentFile = null;
BufferedInputStream input = null;
ServletOutputStream output = null;
ServletContext context = null;
attachmentPath = request.getParameter("attachmentPath");
if (attachmentPath != null && !attachmentPath.isEmpty()) {
attachmentFile = new File(attachmentPath);
if (attachmentFile.exists()) {
response.reset();
context = super.getContext();
contentType = context.getMimeType(attachmentFile.getName());
response.setContentType(contentType);
response.addHeader("content-length", String.valueOf(attachmentFile.length()));
response.addHeader("content-disposition", "attachment;filename=" + attachmentFile.getName());
try {
buffer = new byte[AttachmentTask.DEFAULT_BUFFER_SIZE];
input = new BufferedInputStream(new FileInputStream(attachmentFile));
output = response.getOutputStream();
while ((length = input.read(buffer)) != -1) {
output.write(buffer, 0, length);
index += length;
// output.write(length);
}
output.flush();
input.close();
output.close();
} catch (FileNotFoundException exp) {
logger.error(exp.getMessage());
} catch (IOException exp) {
logger.error(exp.getMessage());
}
} else {
try {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
} catch (IOException exp) {
logger.error(exp.getMessage());
}
}
它与将文件写为二进制或文本模式或浏览器设置有关?
请帮忙。
感谢。
答案 0 :(得分:0)
问题不在于目前为止给出的代码中。您正在使用InputStream
/ OutputStream
而不是Reader
/ Writer
来传输文件。
问题的原因更可能是您创建/保存文件的方式。当您使用Reader
和/或Writer
未被指示对正在读/写的字符使用正确的字符编码时,将会出现此问题。也许您正在创建上传/下载服务,故障是在上传过程中?
假设数据是UTF-8,您应该按如下方式创建阅读器:
Reader reader = new InputStreamReader(new FileInputStream(file), "UTF-8"));
和作者如下:
Writer writer = new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
但是,如果您实际上不需要按字符操作流,但只是想要未经修改地传输数据,那么您实际上应该使用InputStream
/ OutputStream
所有时间。