Скачать файл из поля BLOB - PullRequest
       17

Скачать файл из поля BLOB

2 голосов
/ 07 января 2012

У меня есть приложение, в котором я храню файл (doc, pdf, xls, txt) в поле BLOB базы данных DB2 (закодировано в 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);
    }%>

Я верю, что проблема в кодировке, но я понятия не имею, как это исправить.

1 Ответ

2 голосов
/ 07 января 2012

Вы действительно не должны использовать JSP для этого. JSP предназначены для отображения таких вещей, как HTML, а не двоичные данные. Контейнер JSP будет выполнять свою собственную кодировку символов и изменения типа содержимого за кулисами, что может конфликтовать с вашими намерениями.

Вы должны переписать это как сервлет, а не как JSP, и это должно быть более предсказуемым.

...