java загрузка word doc, содержимое отображается в шестнадцатеричном виде - PullRequest
0 голосов
/ 17 февраля 2012

Приложение Seam с использованием tomcat и postgresql 9.0.3
Приложение позволяет пользователям загружать текстовые документы, которые сохраняются в БД как BLOB и определяются в бине как байтовый массив.

Эти текстовые документы имеютбыл загружен пользователями в формате xml.

Когда я использую этот код с Tomcat (5) в Windows, он работает просто отлично.При использовании с Tomcat (v. 6.0.24) на сервере Linux я получаю поведение, которое отображает содержимое в виде HEX-кода в загруженном файле ???

Сначала я подумал, что сервер отсутствуетнекоторые шрифты, файлы со шрифтами, которые определенно находятся на сервере, показывают то же самое поведение.Даже TXT-файлы делают то же самое.

Код для загрузки выглядит следующим образом:

byte[] wordDoc = createApptLetter();
        HttpServletResponse response = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
        response.setContentType("application/msword");
        fileName  = letter.getFileName();

        response.addHeader("Content-disposition", "attachment; filename=\"" + fileName + "\"");

        response.setContentLength(wordDoc.length);
        OutputStream os = response.getOutputStream();
        //log.error(response.getContentType());
        os.write(wordDoc);
        os.flush();
        os.close();
        facesContext.renderResponse();
        facesContext.responseComplete();

edit: вот метод createApptLetter:

private byte[] createApptLetter() {
    LetterTemplate template = appointmentHome.getInstance().getLetterTemplate();
    Client client = appointmentHome.getInstance().getClientRegistration().getEligibilityCycle().getClient();
    String sageClinic = appointmentHome.getInstance().getFacility().getName();
    String apptDate = appointmentHome.getInstance().getAppointmentDateString();
    String apptTime = appointmentHome.getInstance().getAppointmentTimeString();
    String notes = appointmentHome.getInstance().getAppointmentNotes();
    String longDateFormat = SageConstantsEnum.DateFormats.LONGDATEFORMAT.getDescription();

    SimpleDateFormat df = new SimpleDateFormat(longDateFormat);
    String today = df.format(new Date());
    //StringBuilder sbTemplate = new StringBuilder(new String(template.getLetterTemplateText()));
    String xmlTemplate = new String (template.getLetterTemplateText());

    xmlTemplate = xmlTemplate.replace("letterDate", today);
    xmlTemplate = xmlTemplate.replace("apptDate", apptDate);
    xmlTemplate = xmlTemplate.replace("apptTime", apptTime);
    xmlTemplate = xmlTemplate.replace("apptNotes", notes);
    xmlTemplate = xmlTemplate.replace("sageClinic", sageClinic);

    xmlTemplate = xmlTemplate.replace("clientName", client.getFullname());
    xmlTemplate = xmlTemplate.replace("clientCity",client.getMailingAddress().getAddress().getCity());
    xmlTemplate = xmlTemplate.replace("clientAddress", client.getMailingAddress().getAddress().getStreetaddress());
    xmlTemplate = xmlTemplate.replace("clientState",client.getMailingAddress().getAddress().getState());
    xmlTemplate = xmlTemplate.replace("clientZip", client.getMailingAddress().getAddress().getZipcode());
    return xmlTemplate.getBytes();
}

1 Ответ

1 голос
/ 17 февраля 2012

Измените тип содержимого вашего ответа на «application / octet-stream».Это работает для любого типа файла.Есть пример с JSF .В моем примере я использую a4j:htmlCommandLink от RichFaces, так как вы используете Seam, я думаю, у вас не будет никаких проблем.

...