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

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

К сожалению, сервлет бросил исключение без четкого сообщения и причины. Вот stacktrace:

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)

Ответ 1

Введение

Чтобы просмотреть и выбрать файл для загрузки, вам понадобится поле 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. Он поддерживает только тип enctype формы по умолчанию application/x-www-form-urlencoded. request.getParameter() и супруги будут возвращать null при использовании данных многостраничной формы. Здесь на картинке появился известный Apache Commons FileUpload.

Не ругайте его вручную!

Вы можете теоретически разобрать тело запроса на основе ServletRequest#getInputStream(). Однако это точная и утомительная работа, требующая точного знания RFC2388. Вы не должны пытаться сделать это самостоятельно или copypaste некоей домашней библиотеки без кода, найденного в другом месте в Интернете. Многие онлайн-источники в этом не увенчались успехом, например, 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, в вашем webapp /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 получит пустой тело запроса. См. Также a.o. ServletFileUpload # parseRequest (запрос) возвращает пустой список.

Обратите внимание на FilenameUtils#getName(). Это исправление MSIE в отношении получения имени файла. Этот браузер неправильно отправляет полный путь к файлу по имени вместо имени файла.

В качестве альтернативы вы можете также обернуть это все в Filter, который автоматически анализирует все это и помещает материал обратно в parametermap запроса, чтобы вы могли продолжить использование 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 или даже обычный текст в зависимости от того, что ожидает script для вызова Ajax).


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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

Без компонента или внешней библиотеки в 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();

Отредактируйте свои требования к сервлетам, такие как максимальный размер файла, максимальный размер запроса и другие параметры, которые вы можете установить...

Ответ 6

Для 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");
    }
}

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

Ответ 7

Другой источник этой проблемы возникает, если вы используете Geronimo со встроенным Tomcat. В этом случае после многих итераций тестирования commons-io и commons-fileupload проблема возникает из родительского загрузчика классов, обрабатывающего банки commons-xxx. Это должно быть предотвращено. Авария всегда происходила при:

fileItems = uploader.parseRequest(request);

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

Я добавил исходный код для commons-fileupload и commons-io в мой проект Eclipse для отслеживания фактической ошибки и, наконец, получил некоторое представление. Во-первых, созданное исключение относится к типу Throwable, а не к указанному исключению FileIOException или даже к исключению (они не будут захвачены). Во-вторых, сообщение об ошибке является обманчивым в том смысле, что указанный класс не найден, потому что axis2 не может найти commons-io. Axis2 вообще не используется в моем проекте, но существует как папка в подкаталоге Geronimo repository как часть стандартной установки.

Наконец, я нашел 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>

Ответ 8

Вот пример использования 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);

Ответ 9

вы можете загрузить файл с помощью 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();
                } 
            }   
    }

}

Ответ 10

DiskFileUpload upload=new DiskFileUpload();

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

  String loc="./webapps/prjct name/server folder/"+contentid+extension;


                            File uploadFile=new File(loc);
                            item.write(uploadFile);

Ответ 11

Отправка нескольких файлов для файла мы должны использовать 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>

Ответ 12

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

Скомпилируйте выше servlet 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>