Загрузите файл pfrom с портала, используя JSR 286, Struts 2.2.0 + PortletPlugin 2.2.0 в IBM WP 6.1.5 - PullRequest
0 голосов
/ 25 января 2011

Я использую JSR-286 + Struts 2.2.0 + PortletPlugin 2.2.0

Я не могу задать имя для файла, который пользователь хочет загрузить.Пользователь может получить файл, но его имя повреждено.Вместо «myImage.png» пользователь получает «241883e9» или «241563a2».Если пользователь переименует загруженный файл и откроет его, он увидит, что файл не поврежден.Пожалуйста, посмотрите мой код:

file-list.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>

xml-файл настроек Struts:

<!-- 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 char, имя файла повреждено.: "my file.doc", "02.png" работают нормально.

1 Ответ

1 голос
/ 31 января 2011

Проблема была в результате type = "stream", а также в значении атрибута имени файла заголовка "Content-disposition".Для FF я использовал ISO-8859-1, для IE6-8 я использовал url-кодирование.Я использовал заголовок user-agent для определения браузера.Мое решение имеет только одну проблему, но для меня это приемлемо: IE8 заменяет пробелы в именах файлов подчеркиваниями.Например, «my fav image.png» будет «my_fav_image.png» в IE8.FF не использует кодировку по умолчанию для HTTP и не пытается испортить значение атрибута имени файла.Вы можете найти дополнительную информацию здесь, на StackOverflow.

...