Як завантажувати файли на сервер за допомогою JSP / Servlet?


688

Як я можу завантажувати файли на сервер за допомогою JSP / Servlet? Я спробував це:

<form action="upload" method="post">
    <input type="text" name="description" />
    <input type="file" name="file" />
    <input type="submit" />
</form>

Однак я отримую лише ім'я файлу, а не вміст файлу. Коли я додаю enctype="multipart/form-data"до <form>, потім request.getParameter()повертається null.

Під час дослідження я натрапив на Apache Common FileUpload . Я спробував це:

FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List items = upload.parseRequest(request); // This line is where it died.

На жаль, сервлет кинув виняток без чіткого повідомлення та причини. Ось стек-трек:

SEVERE: Servlet.service() for servlet UploadServlet threw exception
javax.servlet.ServletException: Servlet execution threw an exception
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:313)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:637)

Можливо, ця стаття буде корисною: baeldung.com/upload-file-servlet
Адам Джерард

Відповіді:


1193

Вступ

Для перегляду та вибору файлу для завантаження потрібне HTML- <input type="file">поле у ​​формі. Як зазначено в специфікації HTML, ви повинні використовувати POSTметод, а enctypeатрибут форми повинен бути встановлений "multipart/form-data".

<form action="upload" method="post" enctype="multipart/form-data">
    <input type="text" name="description" />
    <input type="file" name="file" />
    <input type="submit" />
</form>

Після подання такої форми дані двійкової багаточастинкової форми доступні в тілі запиту в іншому форматі, ніж коли enctypeне встановлено.

До Servlet 3.0 API Servlet не підтримував початково multipart/form-data. Він підтримує лише ентетип форми за замовчуванням application/x-www-form-urlencoded. Усі request.getParameter()та повертаються всі повертаються nullпри використанні даних про багаточастинні форми. Тут вийшов добре відомий файл Apache Commons FileUpload .

Не розбирайте її вручну!

Теоретично ви можете самостійно проаналізувати орган запиту на основі ServletRequest#getInputStream(). Однак це точна і копітка робота, яка вимагає точного знання RFC2388 . Не слід намагатися робити це самостійно або копіювати код, що не містить домашню бібліотеку, який можна знайти в інших місцях Інтернету. Багато джерел в Інтернеті важко провалилися в цьому, як-от roseindia.net. Дивіться також завантаження файлу pdf . Вам слід скористатися справжньою бібліотекою, яку мільйони користувачів використовують (і неявно перевіряють!) Протягом багатьох років. Така бібліотека довела свою стійкість.

Коли ви вже користуєтеся Servlet 3.0 або новішою версією, використовуйте нативний API

Якщо ви використовуєте щонайменше Servlet 3.0 (Tomcat 7, Jetty 9, JBoss AS 6, GlassFish 3 тощо), то ви можете просто використовувати стандартний API, що надається HttpServletRequest#getPart()для збору окремих елементів даних із багатьох частин форми (більшість реалізацій Servlet 3.0 фактично використовують Apache Commons FileUpload під обкладинками для цього!). Також звичайні поля форм доступні getParameter()звичайним способом.

Спочатку коментуйте свій сервлет @MultipartConfig, щоб він міг розпізнавати та підтримувати multipart/form-dataзапити і таким чином приступати getPart()до роботи:

@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
    // ...
}

Потім doPost()виконайте його так:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String description = request.getParameter("description"); // Retrieves <input type="text" name="description">
    Part filePart = request.getPart("file"); // Retrieves <input type="file" name="file">
    String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.
    InputStream fileContent = filePart.getInputStream();
    // ... (do your job here)
}

Зверніть увагу на Path#getFileName(). Це виправлення MSIE щодо отримання імені файлу. Цей браузер неправильно надсилає повний шлях до файлу вздовж імені, а не лише ім'я файлу.

Якщо у вас є <input type="file" name="file" multiple="true" />завантаження для кількох файлів, збирайте їх, як показано нижче (на жаль, не існує такого способу, як request.getParts("file")):

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // ...
    List<Part> fileParts = request.getParts().stream().filter(part -> "file".equals(part.getName()) && part.getSize() > 0).collect(Collectors.toList()); // Retrieves <input type="file" name="file" multiple="true">

    for (Part filePart : fileParts) {
        String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.
        InputStream fileContent = filePart.getInputStream();
        // ... (do your job here)
    }
}

Якщо ви ще не користуєтесь сервлетом 3.1, отримайте подане ім'я файлу вручну

Зауважте, що він Part#getSubmittedFileName()був представлений у сервлет 3.1 (Tomcat 8, Jetty 9, WildFly 8, GlassFish 4 тощо). Якщо ви ще не користуєтесь сервлетом 3.1, тоді вам потрібен додатковий утилітний метод для отримання поданого імені файлу.

private static String getSubmittedFileName(Part part) {
    for (String cd : part.getHeader("content-disposition").split(";")) {
        if (cd.trim().startsWith("filename")) {
            String fileName = cd.substring(cd.indexOf('=') + 1).trim().replace("\"", "");
            return fileName.substring(fileName.lastIndexOf('/') + 1).substring(fileName.lastIndexOf('\\') + 1); // MSIE fix.
        }
    }
    return null;
}
String fileName = getSubmittedFileName(filePart);

Зверніть увагу на виправлення MSIE щодо отримання імені файлу. Цей браузер неправильно надсилає повний шлях до файлу вздовж імені, а не лише ім'я файлу.

Якщо ви ще не використовуєте сервер 3.0, використовуйте Apache Commons FileUpload

Якщо ви ще не користуєтеся сервлетом 3.0 (чи не час оновити?), Загальною практикою є використання Apache Commons FileUpload для розбору запитів даних багатопартійної форми. У ньому є чудове керівництво користувача та поширені запитання (ретельно проходьте обидва). Існує також O'Reilly (" cos ") MultipartRequest, але він має деякі (незначні) помилки і вже активно не підтримується роками. Я б не рекомендував його використовувати. Apache Commons FileUpload все ще активно підтримується і на даний момент дуже зрілий.

Для того, щоб використовувати Apache Commons FileUpload, вам потрібно мати принаймні такі файли у своїх веб-сайтах /WEB-INF/lib:

Ваша перша спроба не вдалася, швидше за все, ви забули загальнодоступний IO.

Ось короткий приклад, як може виглядати doPost()ваш UploadServletпри використанні Apache Commons FileUpload:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
        for (FileItem item : items) {
            if (item.isFormField()) {
                // Process regular form field (input type="text|radio|checkbox|etc", select, etc).
                String fieldName = item.getFieldName();
                String fieldValue = item.getString();
                // ... (do your job here)
            } else {
                // Process form file field (input type="file").
                String fieldName = item.getFieldName();
                String fileName = FilenameUtils.getName(item.getName());
                InputStream fileContent = item.getInputStream();
                // ... (do your job here)
            }
        }
    } catch (FileUploadException e) {
        throw new ServletException("Cannot parse multipart request.", e);
    }

    // ...
}

Це дуже важливо , щоб ви не викликаєте getParameter(), getParameterMap(), getParameterValues(), getInputStream(), getReader(), і т.д. на той же запит заздалегідь. Інакше контейнер сервлета прочитає та проаналізує тіло запиту, і таким чином Apache Commons FileUpload отримає порожнє тіло запиту. Див. Також ao ServletFileUpload # parseRequest (запит) повертає порожній список .

Зверніть увагу на FilenameUtils#getName(). Це виправлення MSIE щодо отримання імені файлу. Цей браузер неправильно надсилає повний шлях до файлу вздовж імені, а не лише ім'я файлу.

Крім того, ви можете також обернути все це в Filterавтоматичному розборі і все повернути речі в карту параметрів запиту, щоб ви могли продовжувати використовувати request.getParameter()звичайний спосіб і отримувати завантажений файл request.getAttribute(). Ви можете знайти приклад у цій статті блогу .

Вирішення помилки GlassFish3, яка getParameter()все ще повертаєтьсяnull

Зверніть увагу , що GlassFish версії старше 3.1.2 була помилка , що відрізняється тим , що по- getParameter(), як і раніше повертається null. Якщо ви орієнтуєтесь на такий контейнер і не можете його оновити, вам потрібно отримати значення getPart()з цього методу:

private static String getValue(Part part) throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(part.getInputStream(), "UTF-8"));
    StringBuilder value = new StringBuilder();
    char[] buffer = new char[1024];
    for (int length = 0; (length = reader.read(buffer)) > 0;) {
        value.append(buffer, 0, length);
    }
    return value.toString();
}
String description = getValue(request.getPart("description")); // Retrieves <input type="text" name="description">

Збереження завантаженого файлу (не використовувати getRealPath()ні part.write()!)

Перейдіть до наступних відповідей, щоб отримати детальну інформацію про правильне збереження отриманого InputStream( fileContentзмінної, як показано у наведених вище фрагментах коду) на диску чи базі даних:

Подання завантаженого файлу

Перейдіть до наступних відповідей, щоб отримати детальну інформацію про правильне обслуговування збереженого файлу з диска або бази даних назад клієнту:

Аяксифікуюча форма

Перейдіть до наступних відповідей, як завантажувати за допомогою Ajax (та jQuery). Зауважте, що сервлет-код для збору даних форми для цього не потрібно змінювати! Змінити може лише те, як ви реагуєте, але це досить тривіально (тобто замість переадресації на JSP, просто надрукуйте якийсь JSON чи XML або навіть звичайний текст залежно від того, що очікує сценарій, відповідальний за виклик Ajax).


Сподіваюся, що це все допомагає :)


Ах вибачте, я бачив request.getParts("file")і розгубився x_x
Kagami Sascha Rosylight

З сервлетом 3.0, якщо MultipartConfigумова порушена (наприклад:) maxFileSize, виклик request.getParameter()повертає нуль. Це цілеспрямовано? Що робити, якщо я отримаю деякі регулярні (текстові) параметри перед тим, як дзвонити getPart(і перевірити наявність IllegalStateException)? Це спричиняє NullPointerExceptionвикид, перш ніж у мене з’явиться можливість перевірити IllegalStateException.
вони

@BalusC Я створив публікацію, пов’язану з цим, чи маєте ви уявлення, як я можу отримати додаткові відомості з File API webKitDirectory. Детальніше тут stackoverflow.com/questions/45419598 / ...
Rapster

Якщо ви не на сервлеті 3.0 і використовуєте фокус FileUpload, я виявив, що ви не можете прочитати файл із запиту не один раз. Якщо вам потрібна ця функціональність, ви можете поглянути на SpringPalterPartFilter. Це повідомлення має хороший робочий приклад: stackoverflow.com/a/21448087/1048376
splashout

1
Так, якщо хтось спробує використати код в розділі 3.0 разом з tomcat 7, він може зіткнутися з проблемою String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.частково схожою на мене
raviraja

26

Якщо вам трапляється використовувати Spring MVC, ось що: (Я залишаю це тут, якщо хтось вважає це корисним).

Використовуйте форму з enctypeатрибутом, встановленим на " multipart/form-data" (Те саме, що відповідь BalusC)

<form action="upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="submit" value="Upload"/>
</form>

У своєму контролері скопіюйте параметр запиту, fileщоб MultipartFileввести наступне:

@RequestMapping(value = "/upload", method = RequestMethod.POST)
public void handleUpload(@RequestParam("file") MultipartFile file) throws IOException {
    if (!file.isEmpty()) {
            byte[] bytes = file.getBytes(); // alternatively, file.getInputStream();
            // application logic
    }
}

Ви можете отримати ім'я файлу і його розмір з допомогою MultipartFile«S getOriginalFilename()і getSize().

Я перевірив це у весняній версії 4.1.1.RELEASE.


Якщо я не помиляюся, для цього потрібно налаштувати боб у конфігурації програми вашого сервера ...
Kenny Worden

11

Вам потрібно, щоб common-io.1.4.jarфайл був включений у ваш libкаталог, або якщо ви працюєте в будь-якому редакторі, як NetBeans, тоді вам потрібно перейти до властивостей проекту і просто додати файл JAR і все буде зроблено.

Щоб отримати common.io.jarфайл, просто google його або просто перейдіть на веб-сайт Apache Tomcat, де ви отримаєте можливість безкоштовно завантажити цей файл. Але пам’ятайте одне: завантажте двійковий файл ZIP, якщо ви користувач Windows.


Не можу знайти, .jarале .zip. Ви маєте на увазі .zip?
Malwinder Singh

10

Без компонентної чи зовнішньої бібліотеки в Tomcat 6 o 7

Увімкнення завантаження у файл web.xml :

http://joseluisbz.wordpress.com/2014/01/17/manual-installing-php-tomcat-and-httpd-lounge/#Enabling%20File%20Uploads .

<servlet>
    <servlet-name>jsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    <multipart-config>
      <max-file-size>3145728</max-file-size>
      <max-request-size>5242880</max-request-size>
    </multipart-config>
    <init-param>
        <param-name>fork</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>xpoweredBy</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>3</load-on-startup>
</servlet>

ЯК ВИ МОЖЕТЕ ДИВИТИ :

    <multipart-config>
      <max-file-size>3145728</max-file-size>
      <max-request-size>5242880</max-request-size>
    </multipart-config>

Завантаження файлів за допомогою JSP. Файли:

У файлі html

<form method="post" enctype="multipart/form-data" name="Form" >

  <input type="file" name="fFoto" id="fFoto" value="" /></td>
  <input type="file" name="fResumen" id="fResumen" value=""/>

У файлі або сервлеті JSP

    InputStream isFoto = request.getPart("fFoto").getInputStream();
    InputStream isResu = request.getPart("fResumen").getInputStream();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte buf[] = new byte[8192];
    int qt = 0;
    while ((qt = isResu.read(buf)) != -1) {
      baos.write(buf, 0, qt);
    }
    String sResumen = baos.toString();

Змініть код сервлету вимоги, як макс-розмір файлу , макс-запит розмір і інші варіанти , які ви можете встановити ...


9

Я використовую загальний сервлет для кожної форми Html, має він вкладення чи ні. Цей сервлет повертає a, TreeMapде ключами є ім'я jsp Параметри, а значення - "Введення користувача" і зберігає всі вкладення у фіксованому каталозі, а пізніше ви перейменовуєте вибраний каталог. Я думаю, що це вам допоможе

public class ServletCommonfunctions extends HttpServlet implements
        Connections {

    private static final long serialVersionUID = 1L;

    public ServletCommonfunctions() {}

    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException,
            IOException {}

    public SortedMap<String, String> savefilesindirectory(
            HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        // Map<String, String> key_values = Collections.synchronizedMap( new
        // TreeMap<String, String>());
        SortedMap<String, String> key_values = new TreeMap<String, String>();
        String dist = null, fact = null;
        PrintWriter out = response.getWriter();
        File file;
        String filePath = "E:\\FSPATH1\\2KL06CS048\\";
        System.out.println("Directory Created   ????????????"
            + new File(filePath).mkdir());
        int maxFileSize = 5000 * 1024;
        int maxMemSize = 5000 * 1024;
        // Verify the content type
        String contentType = request.getContentType();
        if ((contentType.indexOf("multipart/form-data") >= 0)) {
            DiskFileItemFactory factory = new DiskFileItemFactory();
            // maximum size that will be stored in memory
            factory.setSizeThreshold(maxMemSize);
            // Location to save data that is larger than maxMemSize.
            factory.setRepository(new File(filePath));
            // Create a new file upload handler
            ServletFileUpload upload = new ServletFileUpload(factory);
            // maximum file size to be uploaded.
            upload.setSizeMax(maxFileSize);
            try {
                // Parse the request to get file items.
                @SuppressWarnings("unchecked")
                List<FileItem> fileItems = upload.parseRequest(request);
                // Process the uploaded file items
                Iterator<FileItem> i = fileItems.iterator();
                while (i.hasNext()) {
                    FileItem fi = (FileItem) i.next();
                    if (!fi.isFormField()) {
                        // Get the uploaded file parameters
                        String fileName = fi.getName();
                        // Write the file
                        if (fileName.lastIndexOf("\\") >= 0) {
                            file = new File(filePath
                                + fileName.substring(fileName
                                        .lastIndexOf("\\")));
                        } else {
                            file = new File(filePath
                                + fileName.substring(fileName
                                        .lastIndexOf("\\") + 1));
                        }
                        fi.write(file);
                    } else {
                        key_values.put(fi.getFieldName(), fi.getString());
                    }
                }
            } catch (Exception ex) {
                System.out.println(ex);
            }
        }
        return key_values;
    }
}

@buhake sindi hey, яким повинен бути файловий шлях, якщо я використовую живий сервер або я живу своїм проектом, завантажуючи файли на сервер
AmanS

2
Будь-який каталог в живому сервері. Якщо ви вкажете код, щоб створити каталог в сервлеті, тоді каталог буде створений в прямому сервері
відчувайте себе добре і програмуйте

8

Для Spring MVC я годинами намагався це зробити, і мені вдалося мати більш просту версію, яка працювала для введення форми і даних, і зображення.

<form action="/handleform" method="post" enctype="multipart/form-data">
  <input type="text" name="name" />
  <input type="text" name="age" />
  <input type="file" name="file" />
  <input type="submit" />
</form>

Контролер для обробки

@Controller
public class FormController {
    @RequestMapping(value="/handleform",method= RequestMethod.POST)
    ModelAndView register(@RequestParam String name, @RequestParam int age, @RequestParam MultipartFile file)
            throws ServletException, IOException {

        System.out.println(name);
        System.out.println(age);
        if(!file.isEmpty()){
            byte[] bytes = file.getBytes();
            String filename = file.getOriginalFilename();
            BufferedOutputStream stream =new BufferedOutputStream(new FileOutputStream(new File("D:/" + filename)));
            stream.write(bytes);
            stream.flush();
            stream.close();
        }
        return new ModelAndView("index");
    }
}

Сподіваюся, це допомагає :)


Ви можете поділитися обраною формою зображення db mysql та показати її на jsp / html?
Вед Пракаш

6

Ще одне джерело цієї проблеми виникає, якщо ви використовуєте Geronimo із вбудованим Tomcat. У цьому випадку після багатьох ітерацій тестування commons-io та commons-fileupload виникає проблема батьківського завантажувача, який обробляє банки commons-xxx. Цьому потрібно запобігти. Збій завжди стався на:

fileItems = uploader.parseRequest(request);

Зауважте, що тип списку fileItems змінився з поточною версією commons-fileupload, зокрема List<FileItem>, на відміну від попередніх версій, де він був загальнимList .

Я додав вихідний код для commons-fileupload та commons-io у свій проект Eclipse, щоб простежити фактичну помилку і нарешті отримав деяке розуміння. По-перше, викинутий виняток має тип Throwable, а не заявлене FileIOException і навіть виняток (вони не будуть захоплені). По-друге, повідомлення про помилку є обов`язковим, оскільки він вказав, що клас не знайдено, тому що ось2 не вдалося знайти Commons-io. Axis2 взагалі не використовується в моєму проекті, але існує як папка в підкаталозі репозиторію Geronimo як частина стандартної установки.

Нарешті, я знайшов 1 місце, яке створило робоче рішення, яке успішно вирішило мою проблему. Ви повинні сховати банки від батьківського завантажувача в плані розгортання. Це було поміщено в geronimo-web.xml з моїм повним файлом, показаним нижче.

Pasted from <http://osdir.com/ml/user-geronimo-apache/2011-03/msg00026.html> 



<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<web:web-app xmlns:app="http://geronimo.apache.org/xml/ns/j2ee/application-2.0" xmlns:client="http://geronimo.apache.org/xml/ns/j2ee/application-client-2.0" xmlns:conn="http://geronimo.apache.org/xml/ns/j2ee/connector-1.2" xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.2" xmlns:ejb="http://openejb.apache.org/xml/ns/openejb-jar-2.2" xmlns:log="http://geronimo.apache.org/xml/ns/loginconfig-2.0" xmlns:name="http://geronimo.apache.org/xml/ns/naming-1.2" xmlns:pers="http://java.sun.com/xml/ns/persistence" xmlns:pkgen="http://openejb.apache.org/xml/ns/pkgen-2.1" xmlns:sec="http://geronimo.apache.org/xml/ns/security-2.0" xmlns:web="http://geronimo.apache.org/xml/ns/j2ee/web-2.0.1">
    <dep:environment>
        <dep:moduleId>
            <dep:groupId>DataStar</dep:groupId>
            <dep:artifactId>DataStar</dep:artifactId>
            <dep:version>1.0</dep:version>
            <dep:type>car</dep:type>
        </dep:moduleId>

<!--Don't load commons-io or fileupload from parent classloaders-->
        <dep:hidden-classes>
            <dep:filter>org.apache.commons.io</dep:filter>
            <dep:filter>org.apache.commons.fileupload</dep:filter>
        </dep:hidden-classes>
        <dep:inverse-classloading/>        


    </dep:environment>
    <web:context-root>/DataStar</web:context-root>
</web:web-app>

0

Ось приклад використання apache commons-fileupload:

// apache commons-fileupload to handle file upload
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(new File(DataSources.TORRENTS_DIR()));
ServletFileUpload fileUpload = new ServletFileUpload(factory);

List<FileItem> items = fileUpload.parseRequest(req.raw());
FileItem item = items.stream()
  .filter(e ->
  "the_upload_name".equals(e.getFieldName()))
  .findFirst().get();
String fileName = item.getName();

item.write(new File(dir, fileName));
log.info(fileName);

0

Найпростіший спосіб може бути запропонований для файлів та елементів керування введенням без мільярда бібліотек:

  <%
  if (request.getContentType()==null) return;
  // for input type=text controls
  String v_Text = 
  (new BufferedReader(new InputStreamReader(request.getPart("Text1").getInputStream()))).readLine();    

  // for input type=file controls
  InputStream inStr = request.getPart("File1").getInputStream();
  char charArray[] = new char[inStr.available()];
  new InputStreamReader(inStr).read(charArray);
  String contents = new String(charArray);
  %>

-1

Ви можете завантажити файл за допомогою jsp / servlet.

<form action="UploadFileServlet" method="post">
  <input type="text" name="description" />
  <input type="file" name="file" />
  <input type="submit" />
</form>

з іншого боку сервера. використовувати наступний код.

     package com.abc..servlet;

import java.io.File;
---------
--------


/**
 * Servlet implementation class UploadFileServlet
 */
public class UploadFileServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public UploadFileServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.sendRedirect("../jsp/ErrorPage.jsp");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub

            PrintWriter out = response.getWriter();
            HttpSession httpSession = request.getSession();
            String filePathUpload = (String) httpSession.getAttribute("path")!=null ? httpSession.getAttribute("path").toString() : "" ;

            String path1 =  filePathUpload;
            String filename = null;
            File path = null;
            FileItem item=null;


            boolean isMultipart = ServletFileUpload.isMultipartContent(request);

            if (isMultipart) {
                FileItemFactory factory = new DiskFileItemFactory();
                ServletFileUpload upload = new ServletFileUpload(factory);
                String FieldName = "";
                try {
                    List items = upload.parseRequest(request);
                    Iterator iterator = items.iterator();
                    while (iterator.hasNext()) {
                         item = (FileItem) iterator.next();

                            if (fieldname.equals("description")) {
                                description = item.getString();
                            }
                        }
                        if (!item.isFormField()) {
                            filename = item.getName();
                            path = new File(path1 + File.separator);
                            if (!path.exists()) {
                                boolean status = path.mkdirs();
                            }
                            /* START OF CODE FRO PRIVILEDGE*/

                            File uploadedFile = new File(path + Filename);  // for copy file
                            item.write(uploadedFile);
                            }
                        } else {
                            f1 = item.getName();
                        }

                    } // END OF WHILE 
                    response.sendRedirect("welcome.jsp");
                } catch (FileUploadException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                } 
            }   
    }

}

-1
DiskFileUpload upload=new DiskFileUpload();

З цього об'єкта ви маєте отримати файлові елементи та поля, щоб вони могли зберігатись на сервері так:

String loc="./webapps/prjct name/server folder/"+contentid+extension;
File uploadFile=new File(loc);
item.write(uploadFile);

-2

Надсилання декількох файлів у файл, які ми маємо використати enctype="multipart/form-data"
та для надсилання декількох файлів multiple="multiple"у тег введення

<form action="upload" method="post" enctype="multipart/form-data">
 <input type="file" name="fileattachments"  multiple="multiple"/>
 <input type="submit" />
</form>

2
Як ми будемо робити getPart ("fileattachments"), щоб ми отримали масив Parts замість цього? Я не думаю, що getPart для декількох файлів буде працювати?
CyberMew

-2

HTML PAGE

<html>
<head>
<title>File Uploading Form</title>
</head>
<body>
<h3>File Upload:</h3>
Select a file to upload: <br />
<form action="UploadServlet" method="post"
                        enctype="multipart/form-data">
<input type="file" name="file" size="50" />
<br />
<input type="submit" value="Upload File" />
</form>
</body>
</html> 

ФАЙЛ СЛУЖБИ

// Import required java libraries
import java.io.*;
import java.util.*;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.output.*;

public class UploadServlet extends HttpServlet {

   private boolean isMultipart;
   private String filePath;
   private int maxFileSize = 50 * 1024;
   private int maxMemSize = 4 * 1024;
   private File file ;

   public void init( ){
      // Get the file location where it would be stored.
      filePath = 
             getServletContext().getInitParameter("file-upload"); 
   }
   public void doPost(HttpServletRequest request, 
               HttpServletResponse response)
              throws ServletException, java.io.IOException {
      // Check that we have a file upload request
      isMultipart = ServletFileUpload.isMultipartContent(request);
      response.setContentType("text/html");
      java.io.PrintWriter out = response.getWriter( );
      if( !isMultipart ){
         out.println("<html>");
         out.println("<head>");
         out.println("<title>Servlet upload</title>");  
         out.println("</head>");
         out.println("<body>");
         out.println("<p>No file uploaded</p>"); 
         out.println("</body>");
         out.println("</html>");
         return;
      }
      DiskFileItemFactory factory = new DiskFileItemFactory();
      // maximum size that will be stored in memory
      factory.setSizeThreshold(maxMemSize);
      // Location to save data that is larger than maxMemSize.
      factory.setRepository(new File("c:\\temp"));

      // Create a new file upload handler
      ServletFileUpload upload = new ServletFileUpload(factory);
      // maximum file size to be uploaded.
      upload.setSizeMax( maxFileSize );

      try{ 
      // Parse the request to get file items.
      List fileItems = upload.parseRequest(request);

      // Process the uploaded file items
      Iterator i = fileItems.iterator();

      out.println("<html>");
      out.println("<head>");
      out.println("<title>Servlet upload</title>");  
      out.println("</head>");
      out.println("<body>");
      while ( i.hasNext () ) 
      {
         FileItem fi = (FileItem)i.next();
         if ( !fi.isFormField () )  
         {
            // Get the uploaded file parameters
            String fieldName = fi.getFieldName();
            String fileName = fi.getName();
            String contentType = fi.getContentType();
            boolean isInMemory = fi.isInMemory();
            long sizeInBytes = fi.getSize();
            // Write the file
            if( fileName.lastIndexOf("\\") >= 0 ){
               file = new File( filePath + 
               fileName.substring( fileName.lastIndexOf("\\"))) ;
            }else{
               file = new File( filePath + 
               fileName.substring(fileName.lastIndexOf("\\")+1)) ;
            }
            fi.write( file ) ;
            out.println("Uploaded Filename: " + fileName + "<br>");
         }
      }
      out.println("</body>");
      out.println("</html>");
   }catch(Exception ex) {
       System.out.println(ex);
   }
   }
   public void doGet(HttpServletRequest request, 
                       HttpServletResponse response)
        throws ServletException, java.io.IOException {

        throw new ServletException("GET method used with " +
                getClass( ).getName( )+": POST method required.");
   } 
}

web.xml

Компілюйте над сервлетом UploadServlet і створіть необхідний запис у файлі web.xml наступним чином.

<servlet>
   <servlet-name>UploadServlet</servlet-name>
   <servlet-class>UploadServlet</servlet-class>
</servlet>

<servlet-mapping>
   <servlet-name>UploadServlet</servlet-name>
   <url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.