2012-02-17 11 views
0

tomcatとpostgresqlを使用したSeamアプリケーション9.0.3
アプリケーションでは、DBに保存されている単語文書をBLOBとしてダウンロードし、Beanでバイト配列として定義できます。javaダウンロードword doc、内容は16進数で表示

これらのワード文書は、ユーザーによってxml形式でアップロードされています。

WindowsでこのコードをTomcat(5)と併用すると、うまく動作します。 LinuxサーバーでTomcat(v。6.0.24)と一緒に使用すると、ダウンロードしたファイルに内容が16進数で表示されるようになります。

最初は、サーバーにはいくつかのフォントがないと考えられましたが、サーバー上にあるフォントは同じ動作をしています。 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(); 

編集:ここ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

変更あなたの応答のコンテンツタイプを "アプリケーション/ octet-streamと" 次のように

ダウンロードを行うためのコードがあります。これはどんな種類のファイルでも機能します。 JSFの例があります。私の例では、RichFacesのa4j:htmlCommandLinkを使用しています。Seamを使用しているので問題はありません。

+0

ご返信ありがとうございます。それをapplication/octet-streamに変更しました。まだ16進数で表示されています – mcgyver5

+0

@ mcgyver5 'createApptLetter'関数は何をしますか?ダウンロード機能の完全なコードを表示できますか? –

+0

ok。 createApptLetterメソッドを含めるように編集した質問。あなたが見ることができるように、それは単純な文字列置換である。そして、私が言ったように、これは窓の上で走っている風船でうまくいきます。私はそれがjdbcドライバの問題であるという理論を持っています。 – mcgyver5