我有一个应用程序,我将文件(doc,pdf,xls,txt)存储在DB2数据库的BLOB字段中(以base64编码)。现在我必须下载文件,我只是在下载文本文件时取得了成功。当我下载其他文件时,我无法正确解码它们。
我尝试使用两种方式在BLOB文件上插入内容:
data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,RW5yaWNvIEJlcmdhbW8=
和
RW5yaWNvIEJlcmdhbW8=
在这两种情况下,结果对我来说都是一样的。
我用来下载和解码这些文件的代码是:
fileDownload.jsp
:
<%@ page import="java.io.*"%>
<%@ page import="com.ibm.misc.*"%>
<%
String fileName = request.getParameter("fileName");
String fileType = request.getParameter("fileType");
String fileContent = b64Decode(request.getParameter("fileContent"));
response.setContentType(fileType);
//response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=\""
+ fileName + "\"");
response.setContentLength((int) fileContent.length());
try {
StringBuffer sb = new StringBuffer(fileContent);
InputStream in = new ByteArrayInputStream(sb.toString().getBytes());
//InputStream in = new ByteArrayInputStream(sb.toString().getBytes("UTF-8"));
ServletOutputStream sos = response.getOutputStream();
byte[] outputByte = new byte[4096];
//copy binary contect to output stream
while (in.read(outputByte, 0, 4096) != -1) {
sos.write(outputByte, 0, 4096);
}
in.close();
sos.flush();
sos.close();
} catch (IOException ex) {
ex.printStackTrace();
}
%>
<%!public String b64Decode(String msg) {
BASE64Decoder decoder = new BASE64Decoder();
byte[] decodedBytes = null;
try {
decodedBytes = decoder.decodeBuffer(msg);
} catch (IOException e) {
e.printStackTrace();
}
return new String(decodedBytes);
}%>
我确实认为问题在于编码,但我不知道如何解决这个问题。
答案 0 :(得分:2)
你真的不应该为此使用JSP。 JSP旨在呈现HTML之类的内容,而不是二进制数据。 JSP容器将在幕后执行自己的字符编码和内容类型的恶作剧,这可能与您的意图冲突。
你应该把它重写为一个servlet,而不是一个JSP,它应该更容易预测。