0

JSR-286 + Struts 2.2.0 + PortletPlugin 2.2.0 を使用しています

ユーザーがダウンロードしたいファイルの名前を設定できません。ユーザーはファイルを取得できますが、その名前は壊れています。「myImage.png」の代わりに、ユーザーは「241883e9」または「241563a2」を取得します。ユーザーがダウンロードしたファイルの名前を変更して開くと、ファイルが破損していないことがわかります。私のコードを見てください:

file-listing.jsp:

<li onclick="goToAction('<s:url action="downloadattachement" portletUrlType="resource" />', {'attachementId':<s:property value="id" />}, 'POST')"><s:property value="name"/></li>

関数「goToAction」は動的に生成して送信します(POSTとGETの両方を試しましたが、役に立ちません):

<form action="/wps/myportal/!VERY_LONG_PORTAL_URL_GOES_HERE/" method="POST" id="actionUrlTemporaryForm1295987206509"> <input type="hidden" name="attachementId" value="2" /> </form>

私のstruts xml構成ファイル:

<!-- Download attached file by attachementId -->
    <action name="downloadattachement" class="ru.portal.DownloadAttachementAction">
        <result name="success" type="stream">
            <param name="allowCaching">false</param>
            <param name="contentType">${contentType}</param>
            <param name="inputName">attachementContents</param>
            <param name="contentDisposition">>attachment;filename="${fileName}"</param>
            <param name="bufferSize">1024</param>
        </result>
    </action>

そしてアクションコード:

@Override
    protected String bareExecute() throws Exception {
        String result = Action.SUCCESS;     
        Attachement attachement = EJBUtil.lookup(IAttachementManager.class).get(attachementId);
        LOG.info("Trying to download Attachement[{}]", attachement);
        File attachementFile = new File(attachement.getPath());     
        if(attachementFile.exists()){
            attachementContents = new FileInputStream(attachementFile);
        }else{
            LOG.error("There is no attachement[{}] file here[{}]",attachementId, attachement.getPath());
        }


        return result;
    }

    public String getContentType(){
        return attachement.getMimeType();
    }

    public String getFileName(){
        LOG.trace("#getFileName {}", attachement.getName());
        return attachement.getName();
    }

    public Integer getAttachementId() {
        return attachementId;
    }

    public void setAttachementId(Integer attachementId) {
        this.attachementId = attachementId;
    }

    public Attachement getAttachement() {
        return attachement;
    }

    public InputStream getAttachementContents() {
        return attachementContents;
    }

    @Override
    public String getCurrentActionName() {      
        return "downloadattachement";
    }

ログ ファイルで次の LOG 行を見たことがありません: LOG.trace("#getFileName {}", attachement.getName());

でもわかる

[25.01.11 23:26:46:582 MSK] 00000052 srt W com.ibm.ws.webcontainer.srt.SRTServletResponse setHeader 警告: ヘッダーを設定できません。応答はすでにコミットされています。

応答のヘッダーを設定できないようです... :(

私は何を間違っていますか?助けてください。

UPD:部分的な解決策を見つけました:このコードをアクションに追加しました:

PortletActionContext.getResponse().setProperty("content-Disposition", "attachment;filename=\""+attachement.getName()+"\"");                     
PortletActionContext.getResponse().setProperty("content-Type", attachement.getMimeType());

現在、問題はファイル名にあります。ASCII 文字以外のファイル名が含まれていると、ファイル名が破損します。「my file.doc」、「02.png」などのファイル名は正常に機能します。

4

1 に答える 1

1

問題は、result type="stream" と、"Content-disposition" ヘッダーの filename 属性値にもありました。FF では ISO-8859-1 を使用し、IE6-8 では URL エンコーディングを使用しました。ユーザーエージェントヘッダーを使用してブラウザーを特定しました。私の解決策には 1 つの問題しかありませんが、私にとっては許容できる問題です。IE8 では、ファイル名の空白がアンダースコアに置き換えられます。たとえば、「my fav image.png」は「my_fav_image.png」になり、IE8 になります。FF は HTTP のデフォルトのエンコーディングを理解しており、ファイル名の属性値を壊そうとはしません。追加情報については、StackOverflow を参照してください。

于 2011-01-31T12:15:21.260 に答える