我曾尝试开发一个允许用户下载文件的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());
}
}
它与二进制或文本模式或浏览器设置写入文件有关?
请帮助。
谢谢。
问题不在目前给出的代码中。您正确地使用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
。
参见:
- Unicode -如何得到正确的字符?