由于开发限制,我们将所有以 Base64 格式从客户端发送到服务器的数据,以及上传的文件(pdf 或 txt 文件)。在 java 中执行此过程后,这些文件将作为 LONGBLOB 正确存储在 mysql 数据库中:
decoder = new BASE64Decoder();
decodedBytes = decoder.decodeBuffer(request.getParameter("fic_adjunto"));
ficheroAdjunto = new SerialBlob(decodedBytes);
但是当我想从 jsp 下载一些文件时,我使用带有 html 链接的 servlet 代码:
jsp 文件:
<a href='GestionDescargas?valor=LoadFile&IdEvent=26'>
服务器端:
Conexion oConexion = new Conexion();
Evento oEvento = new Evento();
oEvento = oConexion.RecuperaEventoByIdEvento(Integer.parseInt(request.getParameter("IdEvent")));
response.setHeader("Expires", "0");
response.setHeader("Cache-Control","must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment;filename=" + oEvento.getNomFicheroAdjunto());
Blob fileBlob = oEvento.getFicheroAdjunto();
int blobLength = (int) fileBlob.length();
byte[] blobAsBytes = fileBlob.getBytes(1, blobLength);
String base64String = Base64.encodeBase64String(blobAsBytes);
InputStream is = new ByteArrayInputStream(base64String.getBytes("UTF-8"));
int read=0;
byte[] bytes = new byte[BYTES_DOWNLOAD];
OutputStream os = response.getOutputStream();
while((read = is.read(bytes))!= -1)
{
os.write(bytes, 0, read);
}
os.flush();
os.close();
我在这个编程世界中还是个新手,你能帮我一下吗?我已经尝试了所有方法,但只得到了base64字符串(甚至不等于原始字符串,但几乎)
原始base64字符串:
data:text/plain;base64,VGFibGEgZGUgaGlzdG9yaWNvIGNhdGVnb3LtYXMgeSBkZSBwcm9kdWN0b3MsIHBhcmEgZWwgY2llcnJlIGRlZmluaXRpdm8gZGVsIGV2ZW50by4NCg0KQWwgZWxpbWluYXIgdW5hIGNhdGVnb3JpYSwgc2UgZWxpbWluYW4gdG9kb3Mgc3VzIHByb2R1Y3Rvcy4NCg0KQWwgZWxpbWluYXIgdW4gcHJvZHVjdG8sIHNlIGVsaW1pbmEgZGUgdG9kb3MgbG9zIHNpdGlvcyBlbiBsb3MgcXVlIGVzdOkgc2llbmRvIHVzYWRvLg0KDQoJLVNlIGVsaW1pbmEgZGVsIGFsbWFj6W4uDQoJLVNlIGVsaW1pbmEgZGUgbGFzIHBsYW50aWxsYXMuIChzYW1jYXQucGxhbnRpbGxhX3Byb2R1Y3RvKQ0KCS1TZSBlbGltaW5hIGRlbCBzaXN0ZW1hIGRlIGdlc3Rpb24gZGUgYWxlcnRhcy4gKHNhbWNhdC5hbGVydGFfcmVzZXJ2YSkNCgktU2UgZWxpbWluYSBkZSBsb3MgZXZlbnRvcyBubyBGSU5BTElaQURPUyArIFBvc2libGVzIHJvdHVyYXMgKyBBQ1RVQUxJWkFDSdNOIFBSRUNJTyBGSU5BTCAoc2FtY2F0LnBlcmRpZGFfZXZlbnRvLCBzYW1jYXRfcHJvZHVjdG9fZXZlbnRvKQ0KDQoNCg0KQWxlcnRhcywgc29sbyB1bmEgdmV6IGVsIG1pc21vIHByb2R1Y3RvIHBvciBhbGVydGE=
从数据库字符串解码:
data/text/plain/base64/VGFibGEgZGUgaGlzdG9yaWNvIGNhdGVnb3LtYXMgeSBkZSBwcm9kdWN0b3MsIHBhcmEgZWwgY2llcnJlIGRlZmluaXRpdm8gZGVsIGV2ZW50by4NCg0KQWwgZWxpbWluYXIgdW5hIGNhdGVnb3JpYSwgc2UgZWxpbWluYW4gdG9kb3Mgc3VzIHByb2R1Y3Rvcy4NCg0KQWwgZWxpbWluYXIgdW4gcHJvZHVjdG8sIHNlIGVsaW1pbmEgZGUgdG9kb3MgbG9zIHNpdGlvcyBlbiBsb3MgcXVlIGVzdOkgc2llbmRvIHVzYWRvLg0KDQoJLVNlIGVsaW1pbmEgZGVsIGFsbWFj6W4uDQoJLVNlIGVsaW1pbmEgZGUgbGFzIHBsYW50aWxsYXMuIChzYW1jYXQucGxhbnRpbGxhX3Byb2R1Y3RvKQ0KCS1TZSBlbGltaW5hIGRlbCBzaXN0ZW1hIGRlIGdlc3Rpb24gZGUgYWxlcnRhcy4gKHNhbWNhdC5hbGVydGFfcmVzZXJ2YSkNCgktU2UgZWxpbWluYSBkZSBsb3MgZXZlbnRvcyBubyBGSU5BTElaQURPUyArIFBvc2libGVzIHJvdHVyYXMgKyBBQ1RVQUxJWkFDSdNOIFBSRUNJTyBGSU5BTCAoc2FtY2F0LnBlcmRpZGFfZXZlbnRvLCBzYW1jYXRfcHJvZHVjdG9fZXZlbnRvKQ0KDQoNCg0KQWxlcnRhcywgc29sbyB1bmEgdmV6IGVsIG1pc21vIHByb2R1Y3RvIHBvciBhbGVydGA==
我想要的是无论如何获取原始文件......而不是base64字符串。
非常感谢!!!!
最佳答案
也许问题与您发送文件的方式有关,例如,如果文件使用 iso-8859-1 编码,您需要执行下一步操作(因为您使用 UTF-8 读取 BLOB):
decoder = new BASE64Decoder();
decodedBytes = decoder.decodeBuffer(new String(request.getParameter("fic_adjunto").getBytes("iso-8859-1"), "UTF-8"));
ficheroAdjunto = new SerialBlob(decodedBytes);
仅当您以 iso-8859-1 格式发送文件时,上面的代码才有用,为避免这种情况(重新格式化字符串),您需要强制请求以 UTF-8 格式发送。
关于java - base64 到文件响应不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29158726/