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

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

Ответы [ 12 ]

1145 голосов
/ 11 марта 2010

Введение

Для просмотра и выбора файла для загрузки вам необходимо поле 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() и consorts будут возвращать 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())).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 для анализа запросов данных из нескольких частей. Он имеет превосходное Руководство пользователя и FAQ (внимательно изучите оба). Есть также 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).


Надеюсь, что все это помогает:)

25 голосов
/ 26 августа 2015

Если вы используете 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 getOriginalFilename() и getSize().

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

12 голосов
/ 17 мая 2012

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

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

9 голосов
/ 08 января 2013

Я использую общий сервлет для каждого HTML-формы, имеет ли он вложения или нет. Этот сервлет возвращает 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;
    }
}
8 голосов
/ 15 июля 2017

Для пружины 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");
    }
}

Надеюсь, это поможет:)

8 голосов
/ 25 января 2014

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

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

http://joseluisbz.wordpress.com/2014/01/17/manually-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();

Измените свой код в соответствии с требованиями сервлета, например max-file-size , max-request-size и другие параметры, которые вы можете установить ...

6 голосов
/ 10 сентября 2013

Другой источник этой проблемы возникает, если вы используете 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 голосов
/ 15 июля 2016

HTML СТРАНИЦА

<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>
0 голосов
/ 21 мая 2015

Вот пример использования 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 голосов
/ 23 марта 2015
DiskFileUpload upload=new DiskFileUpload();

Из этого объекта вы должны получить элементы и поля файла, после чего вы можете сохранить их на сервере следующим образом:

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