Struts2 Fileupload дает нулевой файл в классе действий

Я пытаюсь реализовать процесс загрузки файлов в своем веб-приложении, используя перехватчик struts2 fileUpload. ниже мой код в

index.jsp

<tags:form action="fileUpload" method="post" enctype="multipart/form-data">
   <tags:file name="fileUpload" label="Choose File"/>
   <tags:submit value="Upload"/>     
</tags:form> 

struts.xml

<action name="fileUpload" class="com.hibernate.action.FileUploadAction">
    <interceptor-ref name="fileUploadStack"/>
    <interceptor-ref name="fileUpload">
        <param name="maximumSize">1024000</param>
        <param name="allowedTypes">application/pdf</param>
    </interceptor-ref>
    <result name="success">/viewChapters.jsp</result>
</action>

FileUploadAction.java

public class FileUploadAction extends ActionSupport
{
private File fileUpload;
private String contentType;
private String fileName;
private String destPath;
/// setter and getter methods
 public String execute()
{
    destPath="C:\\WebPortal_testing";
    try
    {
        System.out.println("Source File Name:"+fileUpload);
        System.out.println("Destination File Name:"+fileName);

        File destFile= new File(destPath,fileName);
        FileUtils.copyFile(fileUpload, destFile);
    }
    catch(IOException exception)
    {
        exception.printStackTrace();
        return ERROR;
    }
    return SUCCESS;
 }

когда я выбираю файл PDF на странице index.jsp и нажимаю кнопку загрузки, он дает нулевое значение в поле fileUpload класса действия.

Я выполняю приложение в режиме отладки и дал это

System.out.println("Source File Name:"+fileUpload);

чтобы проверить, что он возвращает, и я получаю null.


person Ghost Rider    schedule 13.11.2015    source источник


Ответы (1)


<сильный>1. Неверная конфигурация перехватчика

FileUploadStack:

<!-- Sample file upload stack -->
<interceptor-stack name="fileUploadStack">
    <interceptor-ref name="fileUpload"/>
    <interceptor-ref name="basicStack"/>
</interceptor-stack>

тогда то, что вы действительно определяете, это:

    <interceptor-ref name="fileUpload"/>
    <interceptor-ref name="basicStack"/>
    <interceptor-ref name="fileUpload">
        <param name="maximumSize">1024000</param>
        <param name="allowedTypes">application/pdf</param>
    </interceptor-ref>

С использованием

  • два раза перехватчик fileUpload
  • применяя ваши ограничения на максимальный размер и разрешенные типы только ко второму.

Просто сделать

<interceptor-ref name="fileUploadStack">
    <param name="fileUpload.maximumSize">1024000</param>
    <param name="fileUpload.allowedTypes">application/pdf</param>
</interceptor-ref>

<сильный>2. Атрибуты файла неверны

Атрибуты типа содержимого и имени файла должны начинаться с имени атрибута файла.

В твоем случае:

private File fileUpload;
private String fileUploadContentType;
private String fileUploadFileName;

Полный пример можно найти в этом вопросе.


<сильный>3. Вы печатаете файл вместо имени файла

System.out.println("Source File Name:"+fileUpload);

Это файл, а не имя файла, и, кстати, имя файла передается в другой переменной.


Исправьте это и повторите попытку. Также обратите внимание, что небезопасно использовать <tags: в качестве префикса, когда весь мир использует <s:. В этом нет никакой выгоды, только осложнения. Просто используйте <s:.

person Andrea Ligios    schedule 13.11.2015
comment
Спасибо за ваш ответ. относительно вашего 3. Вы печатаете файл вместо имени файла, которое я использую только для целей тестирования. Я обновил все в соответствии с вашими предложениями, но не повезло. Я все еще получаю ту же проблему. - person Ghost Rider; 13.11.2015
comment
Затем внимательно проверьте сеттеры или опубликуйте более подробную информацию, потому что теперь все выглядит нормально. - person Andrea Ligios; 13.11.2015
comment
Извините за задержку. Я все еще сталкиваюсь с проблемой. Я отложил эту часть реализации и работаю над другими частями приложения, где столкнулся с несколькими другими проблемами. Я опубликую эти сомнения через некоторое время, пожалуйста, прокомментируйте их, когда они будут свободны. моя искренняя благодарность за вашу помощь - person Ghost Rider; 17.11.2015
comment
Хорошо, можете ли вы отредактировать свой вопрос, применив последний испробованный код (тот, с изменениями, предложенными в ответе)? Так что я могу проверить, что идет на юг - person Andrea Ligios; 17.11.2015
comment
@AndreaLigios Перехватчик struts2 fileupload не проверяет тип содержимого, является ли содержимое файла изображением или нет. При загрузке текстового файла в виде изображения (я изменил расширение файла с txt на png) его принятие означает, что загрузка файла выполнена. Я думаю, что это просто проверка расширения. Я также установил allowedTypes как image/bmp,image/png,image/gif,image/jpeg,image/jpg. Поправьте меня, если я сделал неправильно. Я использую struts2.3.32 версию. Если я загружаю фактическое изображение, его загрузка, так что это правильно. - person SatyaTNV; 17.03.2017
comment
@Satya, это ошибка браузера. Браузер определяет тип контента для передачи в основном на основе расширения; следовательно, он часто будет отправлять неправильный тип содержимого, если расширение неверно. Вы можете проверить это, изучив contentType в отправленном запросе. Подробнее: stackoverflow.com/a/42803060/1654265 - person Andrea Ligios; 17.03.2017