Загрузка нескольких файлов с использованием одного тега файла в Struts 2 - PullRequest
3 голосов
/ 22 марта 2012

Я хочу загрузить несколько файлов, используя один тег файла Struts 2.

Как и в Gmail, мы прикрепляем несколько файлов, используя клавишу CTRL, чтобы выбрать несколько файлов.

Я знаю, как загрузить несколько файлов, но я хочу использовать один тег файла.

Ответы [ 2 ]

1 голос
/ 22 июля 2015

В следующем примере программы показано, как реализовать функциональность для загрузки нескольких файлов с помощью инфраструктуры Struts2. Приложение показывает форму загрузки, которая позволяет пользователю выбрать три файла для загрузки одновременно. Загруженные файлы копируются в папку, настроенную в файле struts.xml приложения.

Давайте посмотрим, как кодируется пример приложения. Форма загрузки реализована на странице upload.jsp следующим образом:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags" %>   
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Multiple Files Upload with Struts2</title>
</head>
<body>
    <center>
        <h2>Pick multiple files to upload</h2>
        <s:form action="uploadFile" enctype="multipart/form-data" method="post">
            <s:file name="fileUpload" multiple="multiple" label="Pick files" size="30"/>
           <br/>
            <s:submit value="Upload All" />
        </s:form>
    </center>
</body>
</html>

Реализуйте класс действий Struts2 в MultipleFilesUploadAction.java файле следующим образом:

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;

public class MultipleFilesUploadAction {
    private File[] fileUpload;
    private String[] fileUploadFileName;
    private String[] fileUploadContentType;

    /**
     * This is the path to save uploaded file, which is configured in struts.xml
     */
    private String saveDirectory;

    public String doUpload() {

        // copy the uploaded files into pre-configured location
        for (int i = 0; i < fileUpload.length; i++) {
            File uploadedFile = fileUpload[i];
            String fileName = fileUploadFileName[i];
            File destFile = new File(saveDirectory + File.separator + fileName);
            try {
                FileUtils.copyFile(uploadedFile, destFile);
            } catch (IOException ex) {
                System.out.println("Could not copy file " + fileName);
                ex.printStackTrace();
            }
        }

        return "success";
    }

    public File[] getFileUpload() {
        return fileUpload;
    }

    public void setFileUpload(File[] fileUploads) {
        this.fileUpload = fileUploads;
    }

    public String[] getFileUploadFileName() {
        return fileUploadFileName;
    }

    public void setFileUploadFileName(String[] fileUploadFileNames) {
        this.fileUploadFileName = fileUploadFileNames;
    }

    public String[] getFileUploadContentType() {
        return fileUploadContentType;
    }

    public void setFileUploadContentType(String[] fileUploadContentTypes) {
        this.fileUploadContentType = fileUploadContentTypes;
    }

    public String getSaveDirectory() {
        return saveDirectory;
    }

    public void setSaveDirectory(String saveDir) {
        this.saveDirectory = saveDir;
    }
}

В этом классе действий POJO мы используем три массива для хранения загруженных файлов:

private File[] fileUpload;
private String[] fileUploadFileName;
private String[] fileUploadContentType;
  • Обратите внимание, что слово « fileUpload » соответствует значению имени атрибут тега <s:file> в файле upload.jsp. Struts2-х Перехватчик с именем fileUpload будет извлекать данные для этих переменных через сеттеры.
  • Значение переменной saveDirectory задается через соответствующий устанавливается перехватчиком staticParams в Struts2, и это значение может быть настроено в файле struts.xml.
  • Метод ввода класса действий doUpload() копирует загруженные файлы из временного каталога в место, указанное saveDirectory, затем перенаправьте в «успешное» представление, которое страница результатов.

Страница результатов result.jsp - довольно простая, которая показывает успешное сообщение:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Upload result</title>
</head>
<body>
    <center>
        <h2>The files were uploaded successfully</h2>
    </center>
</body>
</html>

Мы соединяем страницу формы загрузки, класс действия и страницу результатов через файл struts.xml приложения следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <constant name="struts.multipart.maxSize" value="20971520" /> <!-- 20MB -->

    <package name="fileUpload" extends="struts-default">

        <action name="uploadFile" class="com.example.struts.MultipleFilesUploadAction"
            method="doUpload">

            <param name="saveDirectory">E:/Test/Upload</param>

            <interceptor-ref name="fileUpload">
                <param name="allowedTypes">*/*</param>
                <param name="maximumSize">4194304</param> <!-- 4MB -->
            </interceptor-ref>

            <interceptor-ref name="staticParams"/>
            <interceptor-ref name="params" />
            <interceptor-ref name="validation" />
            <interceptor-ref name="workflow" />

            <result name="success" type="redirect">/result.jsp</result>
            <result name="input">/upload.jsp</result>
        </action>
    </package>

</struts>
  • Здесь перехватчик fileUpload настроен на разрешение всех файлов типы могут быть загружены, и максимальный размер для отдельного файла 4MB.
  • Константа struts.multipart.maxSize ограничивает максимально допустимый размер для составного запроса составляет 20 МБ. Это означает, что общий размер загрузки размер файлов не может превышать 20 МБ.
1 голос
/ 22 марта 2012

Я загружаю несколько файлов в небольшом приложении галереи.Если ваше действие уже настроено на получение нескольких файлов, то это так же просто, как (Внимание, это работает практически во всех основных браузерах, кроме IE, поэтому для этого вам потребуется решение на основе jQuery или flash):

<s:form namespace="/gallery" action="image-upload" method="POST" enctype="multipart/form-data">
    <s:file name="image" multiple="multiple"/>
    <s:submit/>
</s:form>

Вы, наверное, уже смотрели на параметр, который устанавливает максимальный размер файла (для одного файла), по умолчанию это 2 МБ, если я правильно помню, и есть максимальное значение для максимального общего размера файла (то естьразмер всех файлов, суммируемых вместе).Если пользователь может загружать хорошую коллекцию изображений, увеличивая это более позднее значение, очень полезно, чтобы установить это значение примерно на 20 МБ (в struts.xml):

<constant name="struts.multipart.maxSize" value="20000000" /> 

Редактировать: Для заинтересованных,HTML-код, представленный выше: ...

<form id="image-upload" name="image-upload" action="/PhotoGallery/gallery/image-upload.action" method="POST" enctype="multipart/form-data">
    <input type="file" name="image" value="" id="image-upload_image" multiple="multiple"/>
    <input type="submit" id="image-upload_0" value="Submit"/>
</form>

ОБНОВЛЕНИЕ 2014 Фев (почти 2 года спустя) : теперь атрибут Internet Explorer 10, Firefox, Opera, поддерживается,Chrome и Safari.

Он не поддерживался Internet Explorer 9 и более ранними версиями.

...