Как загрузить файлы на сервер, используя JSP / Servlet?


687

Как я могу загрузить файлы на сервер, используя 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

Введение

Для просмотра и выбора файла для загрузки вам нужно <input type="file">поле HTML в форме. Как указано в спецификации 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()операторы and возвращаются 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)
    }
}

Если вы еще не используете Servlet 3.1, вручную введите имя файла

Обратите внимание, что это Part#getSubmittedFileName()было введено в Servlet 3.1 (Tomcat 8, Jetty 9, WildFly 8, GlassFish 4 и т. Д.). Если вы еще не используете Servlet 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 относительно получения имени файла. Этот браузер неправильно отправляет полный путь к файлу вдоль имени, а не только имя файла.

Если вы еще не используете Servlet 3.0, используйте Apache Commons FileUpload

Если вы еще не используете Servlet 3.0 (не пора ли обновиться?), Обычной практикой является использование Apache Commons FileUpload для анализа запросов данных из нескольких частей. Он имеет отличное руководство пользователя и часто задаваемые вопросы (внимательно просмотрите оба). Есть также O'Reilly (" cos ") MultipartRequest, но он имеет некоторые (незначительные) ошибки и больше не поддерживается в течение многих лет. Я не рекомендовал бы использовать это. Apache Commons FileUpload все еще активно поддерживается и в настоящее время очень зрелый.

Чтобы использовать Apache Commons FileUpload, в вашем веб-приложении должны быть как минимум следующие файлы /WEB-INF/lib:

Ваша первоначальная попытка, скорее всего, не удалась, потому что вы забыли общий ввод-вывод.

Вот пример того, как 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 получит пустое тело запроса. Смотрите также. 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
Кагами Саша Розайлайт

В Servlet 3.0, если MultipartConfigусловие нарушено (например:) maxFileSize, вызов request.getParameter()возвращает null. Это специально? Что если я получу некоторые обычные (текстовые) параметры перед вызовом getPart(и проверкой на наличие IllegalStateException)? Это заставляет NullPointerExceptionбыть брошенным прежде, чем у меня есть шанс проверить IllegalStateException.
theyuv

@BalusC Я создал сообщение, связанное с этим, у вас есть идея, как я могу получить дополнительную информацию из File API webKitDirectory. Подробнее здесь stackoverflow.com/questions/45419598/...
Rapster

Если вы не используете Servlet 3.0 и используете трюк FileUpload, я обнаружил, что вы не можете прочитать файл из запроса более одного раза. Если вам нужна эта функциональность, вы можете взглянуть на MultiPartFilter Spring. Этот пост имеет хороший рабочий пример: stackoverflow.com/a/21448087/1048376
всплеск

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
    }
}

Вы можете получить имя файла и размер, используя MultipartFiles getOriginalFilename()и getSize().

Я проверил это с версией Spring 4.1.1.RELEASE.


Если я не ошибаюсь, для этого необходимо, чтобы вы сконфигурировали bean-компонент в конфигурации приложения вашего сервера ...
Кенни Уорден,

11

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

Чтобы получить common.io.jarфайл, просто зайдите в него или перейдите на веб-сайт Apache Tomcat, где вы можете бесплатно загрузить этот файл. Но помните одно: скачайте бинарный ZIP-файл, если вы пользователь Windows.


Не могу найти, .jarно .zip. Вы имеете в виду .zip?
Малвиндер Сингх

10

Без компонента или внешней библиотеки в Tomcat 6 o 7

Включение загрузки в файле web.xml :

http://joseluisbz.wordpress.com/2014/01/17/manually-install-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 name. Параметры и значения - это пользовательские входы и сохраняет все вложения в фиксированном каталоге, а затем вы переименовываете каталог по вашему выбору. Здесь Connections - наш пользовательский интерфейс, имеющий объект подключения. Я думаю, что это поможет вам

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 Эй, какой должен быть путь к файлу, если я использую живой сервер или я живу своим проектом, загружая файлы на сервер
AmanS

2
Любой каталог в live server.Если вы пишете код для создания каталога в сервлете, тогда каталог будет создан в live srver
чувствуйте себя хорошо и программируйте

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, проблема возникает из-за того, что родительский загрузчик классов обрабатывает jars commons-xxx. Это должно быть предотвращено. Авария всегда происходила в:

fileItems = uploader.parseRequest(request);

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

Я добавил исходный код для commons-fileupload и commons-io в свой проект Eclipse, чтобы отследить фактическую ошибку, и наконец получил некоторое представление. Во-первых, выброшенное исключение имеет тип Throwable, а не указанное FileIOException или даже Exception (они не будут перехвачены). Во-вторых, сообщение об ошибке запутанно, поскольку в нем указано, что класс не найден, поскольку axis2 не может найти 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.