Servlet read/output 二进制文件或与原始文件相同的校验和
Servlet read/output binary file nor same checksum as original file
我有一个从磁盘读取文件并将其作为 http 响应发送的 servlet (JSP)。
下载的文件与原始文件的 sha1sum 不同,部分文件似乎已损坏。
我的代码是这样的:
File file = new File((String)application.getAttribute("path")+"/"+item);
if (!file.exists()){
RequestDispatcher dispatcher = application.getRequestDispatcher("/not_found.jsp?item="+item);
dispatcher.forward(request, response);
return;
}
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition",
"attachment;filename=\""+item+"\"");
Locale.setDefault(new Locale("ES","ve"));
FileInputStream fileIn = new FileInputStream(file);
ServletOutputStream outs = response.getOutputStream();
byte[] outputByte = new byte[4096];
//copy binary contect to output stream
System.out.println(new java.util.Date()+"\tStart download\t"+item+"\t"+request.getRemoteAddr()+"\t"+request.getRemoteHost());
while(fileIn.read(outputByte, 0, 4096) != -1)
{
outs.write(outputByte, 0, 4096);
}
fileIn.close();
outs.flush();
outs.close();
System.out.println(new java.util.Date()+"\tEnd Download\t"+item+"\t"+request.getRemoteAddr()+"\t"+request.getRemoteHost());
为什么下载的文件与原始文件有不同的 sha1sum,为什么有些但不是所有下载的文件都是损坏的?
您必须将读取的字节数放在一个变量中,并且只写入您读取的字节数。
您的实现总是写入整个 4096 字节的缓冲区,无论实际读取了多少字节。
像这样:
int i = 0;
while( (i=fileIn.read(outbyteByte, 0, 4096)) != -1){
outs.write(outputByte,0,i);
}
我有一个从磁盘读取文件并将其作为 http 响应发送的 servlet (JSP)。
下载的文件与原始文件的 sha1sum 不同,部分文件似乎已损坏。
我的代码是这样的:
File file = new File((String)application.getAttribute("path")+"/"+item);
if (!file.exists()){
RequestDispatcher dispatcher = application.getRequestDispatcher("/not_found.jsp?item="+item);
dispatcher.forward(request, response);
return;
}
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition",
"attachment;filename=\""+item+"\"");
Locale.setDefault(new Locale("ES","ve"));
FileInputStream fileIn = new FileInputStream(file);
ServletOutputStream outs = response.getOutputStream();
byte[] outputByte = new byte[4096];
//copy binary contect to output stream
System.out.println(new java.util.Date()+"\tStart download\t"+item+"\t"+request.getRemoteAddr()+"\t"+request.getRemoteHost());
while(fileIn.read(outputByte, 0, 4096) != -1)
{
outs.write(outputByte, 0, 4096);
}
fileIn.close();
outs.flush();
outs.close();
System.out.println(new java.util.Date()+"\tEnd Download\t"+item+"\t"+request.getRemoteAddr()+"\t"+request.getRemoteHost());
为什么下载的文件与原始文件有不同的 sha1sum,为什么有些但不是所有下载的文件都是损坏的?
您必须将读取的字节数放在一个变量中,并且只写入您读取的字节数。
您的实现总是写入整个 4096 字节的缓冲区,无论实际读取了多少字节。
像这样:
int i = 0;
while( (i=fileIn.read(outbyteByte, 0, 4096)) != -1){
outs.write(outputByte,0,i);
}