t: inputFileUpload не загружает файл

Я использую myfaces ExtensionFilter для загрузки файла, но файл не устанавливается в мой bean-компонент для дальнейшей обработки.

Вот код:

<h:form id="uploadFileForm" enctype="multipart/form-data">
    <tom:inputFileUpload id="file" 
        value="#{paramUpload.uploadFile}">
        <f:valueChangeListener type="com.bosch.de.plcd.plugin.ParamFileUpload" />
    </tom:inputFileUpload>
    <a4j:commandButton value="#{tpMsgs.upload}"
        styleClass="button" action="#{paramUpload.uploadParamFile}"
        onclick="javascript:updateParentScreen();">
    </a4j:commandButton>
</h:form>

и конфигурация web.xml приведена ниже.

<filter>
    <filter-name>Extensions Filter</filter-name>
    <filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>Extensions Filter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>

Поскольку UploadFile не был установлен в bean-компонент, я также попытался использовать ValueChangeListener, тем не менее, это не bean-компонент :)

Код бина

public class ParamFileUpload implements ValueChangeListener {

    private UploadedFile uploadFile;

    public void uploadParamFile() {
        if(uploadFile != null) {
            LOGGER.info("File type: " + uploadFile.getContentType());
            LOGGER.info("File name: " + uploadFile.getName());
            LOGGER.info("File size: " + uploadFile.getSize() + " bytes");
        }
    }

    public UploadedFile getUploadFile() {
        return uploadFile;
    }

    public void setUploadFile(UploadedFile uploadFile) {
        this.uploadFile = (UploadedFile)uploadFile;
    }

    public void processValueChange(ValueChangeEvent event)
        throws AbortProcessingException {
        this.uploadFile = (UploadedFile) event.getNewValue();
    }
}

Видите ли вы какую-либо другую конфигурацию, которую я мог бы здесь пропустить?


person Satya    schedule 25.05.2012    source источник
comment
Вы пытались использовать компонент тега rich:fileUpload из RichFaces? или почему вы не хотите его использовать? Кроме того, какие версии JSF, RF и Tomahawk вы используете?   -  person Luiggi Mendoza    schedule 25.05.2012
comment
Да, я пытался, но, поскольку я также использую внешний JQuery, файл Richfaces FileUpload работал не так, как ожидалось. Поэтому пришлось реализовать как ‹balusc.blogspot.in/2008/ 02/uploading-files-with-jsf.html  -  person Satya    schedule 29.05.2012


Ответы (1)


Невозможно загружать файлы с помощью ajax с текущей версией JSF и Tomahawk. Запросы Ajax, созданные JSF, не поддерживают и не используют multipart/form-data. Tomahawk не является библиотекой компонентов на основе ajax. Вместо этого используйте обычную командную кнопку.

<h:commandButton value="#{tpMsgs.upload}"
    styleClass="button" action="#{paramUpload.uploadParamFile}"
    onclick="javascript:updateParentScreen();">
</h:commandButton>

Поддержка загрузки файлов с помощью ajax запланирована для будущего JSF 2.2 с новым компонентом <h:inputFile>.

Кроме того, вы можете использовать собственный <rich:fileUpload> RichFaces. В зависимости от используемой версии RichFaces, он использует либо Flash, либо взлом iframe для достижения асинхронной загрузки файлов.

person BalusC    schedule 25.05.2012
comment
Компонент Richfaces не работал должным образом из-за использования внешнего плагина jQuery. Вот и пришлось поступить таким образом. Но теперь работает нормально :) - person Satya; 29.05.2012