java - base64 到文件响应不起作用

标签 java jsp

由于开发限制,我们将所有以 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/

相关文章:

java - 使用.jar文件在cmd提示符下编译并运行Java代码

java - 为什么以下代码仅适用于 GridLayout?

java - 如何在 Spring Boot 中使用分页对存储库实体进行排序

java - JAX-RS 1.1 的最低 Servlet API 版本

java - WSO2中如何设置Web APP的访问超时时间?

javascript - Apache 反向代理内容长度

AJAX 从 Spring-MVC Controller 获取数据

javascript - JSP 加载时间超过 12 秒

java - 从服务器下载数据

jsp - Gradle使用过滤器替换jsp中的文本