base64文件响应不起作用

时间:2015-03-20 03:07:52

标签: 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字符串。

非常感谢!!!!

1 个答案:

答案 0 :(得分:1)

也许这个问题与你用来发送文件的方式有关,例如,如果文件是用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格式发送。