Jak przesłać pliki na serwer za pomocą JSP / Servlet?

Jak mogę przesłać pliki na serwer używając JSP / Servlet? Próbowałem tego:

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

Jednak dostaję tylko nazwę pliku, a nie Zawartość pliku. Kiedy dodam enctype="multipart/form-data" do <form>, wtedy request.getParameter() zwraca null.

Podczas badań natknąłem się na Apache Common FileUpload . Próbowałem tego:

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

Niestety, servlet wyrzucił wyjątek bez wyraźnego komunikatu i przyczyny. Oto 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)
Author: Taryn, 2010-03-11

14 answers

Wprowadzenie

Aby przeglądać i wybrać plik do przesłania, potrzebujesz pola HTML <input type="file"> w formularzu. Jak podano w specyfikacji HTML musisz użyć metody POST, a atrybut enctype formularza musi być ustawiony na "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>

Po przesłaniu takiego formularza dane binarnego formularza wieloczęściowego są dostępne w treści żądania w innym formacie niż gdy enctype nie jest ustawiona.

Przed Servletem 3.0 API Servleta nie natywne wsparcie multipart/form-data. Obsługuje tylko domyślny typ enctype application/x-www-form-urlencoded. request.getParameter() i spółgłoski zwracają null przy użyciu danych formularza wieloczęściowego. Tutaj pojawił się dobrze znany Apache Commons FileUpload.

Nie parsuj tego ręcznie!

Teoretycznie możesz samodzielnie przeanalizować ciało żądania na podstawie ServletRequest#getInputStream(). Jest to jednak precyzyjna i żmudna praca, która wymaga precyzyjnej znajomości RFC2388 . Nie powinieneś próbować. aby to zrobić na własną rękę lub skopiuj własny kod bez biblioteki znaleziony gdzie indziej w Internecie. Wiele źródeł internetowych zawiodło mocno w tym zakresie, np. roseindia.net. Zobacz także Przesyłanie pliku pdf . Powinieneś raczej użyć prawdziwej biblioteki, która jest używana (i domyślnie testowana!) przez miliony użytkowników od lat. Taka biblioteka udowodniła swoją solidność.

Jeśli używasz Servleta 3.0 lub nowszego, użyj natywnego API]}

Jeśli używasz co najmniej Servlet 3.0 (Tomcat 7, Jetty 9, JBoss AS 6, GlassFish 3, itp.), wtedy możesz po prostu użyć standardowego API pod warunkiem HttpServletRequest#getPart() aby zebrać poszczególne pozycje danych formularza wieloczęściowego (większość implementacji Servlet 3.0 faktycznie używa Apache Commons FileUpload pod okładkami do tego!). Ponadto zwykłe pola formularzy są dostępne za pomocą getParameter() w zwykły sposób.

Najpierw Adnotuj swój servlet za pomocą @MultipartConfig aby umożliwić rozpoznawanie i obsługę zapytań multipart/form-data i tym samym uzyskać getPart() do pracy:

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

Wtedy, zaimplementuj its doPost() w następujący sposób:

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

Zwróć uwagę na Path#getFileName(). Jest to poprawka MSIE dotycząca uzyskania nazwy pliku. Ta przeglądarka błędnie wysyła pełną ścieżkę pliku wzdłuż nazwy zamiast tylko nazwy pliku.

Jeśli masz {[26] } do przesyłania wielu plików, zbierz je jak poniżej (niestety nie ma takiej metody jak 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)
    }
}

Gdy nie masz jeszcze Servleta 3.1, ręcznie Pobierz nazwę pliku

Zauważ, że Part#getSubmittedFileName() został wprowadzony w Servlet 3.1 (Tomcat 8 ,Jetty 9, WildFly 8, GlassFish 4, itd). Jeśli nie korzystasz jeszcze z Servletu 3.1, potrzebujesz dodatkowej metody narzędzia do uzyskania przesłanej nazwy pliku.

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);

Zwróć uwagę na poprawkę MSIE dotyczącą uzyskania nazwy pliku. Ta przeglądarka błędnie wysyła pełną ścieżkę pliku wzdłuż nazwy zamiast tylko nazwy pliku.

Gdy nie masz jeszcze Servleta 3.0, użyj Apache Commons FileUpload

Jeśli nie jesteś jeszcze na Servlet 3.0 (Czy to nie czas ulepszyć?w tym celu należy użyć Apache Commons FileUpload, aby przetworzyć żądania danych formularza multpart. Posiada doskonały Podręcznik Użytkownika i FAQ (uważnie przejrzyj oba). Jest też O ' Reilly ("cos") MultipartRequest, ale ma kilka (drobnych) błędów i nie jest już aktywnie utrzymywany przez lata. Nie polecam go używać. Apache Commons FileUpload jest nadal aktywnie utrzymywany i obecnie bardzo dojrzały.

W celu użyj Apache Commons FileUpload, musisz mieć co najmniej następujące pliki w swojej aplikacji internetowej /WEB-INF/lib:

Twoja początkowa próba nie powiodła się najprawdopodobniej dlatego, że zapomniałeś o commons IO.

Oto przykład jak może wyglądać doPost() twojego UploadServlet podczas korzystania z 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);
    }

    // ...
}

To bardzo ważne, żebyś nie dzwonił getParameter(), getParameterMap(), getParameterValues(), getInputStream(), getReader(), itp.na to samo żądanie. W przeciwnym razie kontener servleta odczyta i przetworzy treść żądania i w ten sposób Apache Commons FileUpload otrzyma pustą treść żądania. Patrz także a. o. ServletFileUpload # parseRequest (request) zwraca pustą listę .

Zwróć uwagę na FilenameUtils#getName(). Jest to poprawka MSIE dotycząca uzyskania nazwy pliku. Ta przeglądarka błędnie wysyła pełną ścieżkę pliku wzdłuż nazwy zamiast tylko nazwy pliku.

Alternatywnie możesz również owinąć to wszystko w Filter, który przetwarza to wszystko automagicznie i umieszcza rzeczy z powrotem w parametryzmapie żądania, dzięki czemu można kontynuować używanie request.getParameter() w zwykły sposób i pobrać przesłany plik przez request.getAttribute(). możesz znaleźć przykład w tym artykule na blogu .

Obejście błędu GlassFish3 z getParameter() wciąż powraca null

Zauważ, że wersje Glassfish starsze niż 3.1.2 miały błąd , w którym getParameter() nadal zwraca null. Jeśli kierujesz taki kontener i nie można go uaktualnić, następnie musisz wyodrębnić wartość z getPart() za pomocą tej metody użytkowej:

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

Zapisywanie przesłanego pliku (nie używaj getRealPath() ani part.write()!)

Przejdź do poniższych odpowiedzi, aby uzyskać szczegółowe informacje na temat prawidłowego zapisania uzyskanej InputStream (zmiennej fileContent pokazanej w powyższych fragmentach kodu) na dysk lub bazę danych:

Serwowanie przesłanego pliku

Przejdź do następujących odpowiedzi, aby uzyskać szczegółowe informacje na temat prawidłowego serwowania zapisanego pliku z dysku lub bazy danych z powrotem do Klienta:

Ajaksowanie formy

Przejdź do następujących odpowiedzi Jak przesłać za pomocą Ajax (i jQuery). Należy pamiętać, że kod servleta do zbierania danych formularza nie musi być zmieniany w tym celu! Tylko sposób, w jaki reagujesz, może być zmieniony, ale jest to raczej trywialne(tzn. zamiast przekierowywać do JSP, wystarczy wydrukować jakiś JSON lub XML lub nawet zwykły tekst w zależności od tego, czego oczekuje skrypt odpowiedzialny za wywołanie Ajax).


Mam nadzieję, że to wszystko pomoże:)

 1214
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-18 16:11:40

Jeśli zdarzy ci się użyć Spring MVC, oto jak: (Zostawiam to tutaj na wypadek, gdyby ktoś uznał to za przydatne).

Użyj formularza z atrybutem enctype ustawionym na " multipart/form-data "(tak samo jak odpowiedź Balusca)

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

W kontrolerze odwzoruj parametr żądania file na MultipartFile Wpisz w następujący sposób:

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

Możesz uzyskać nazwę i rozmiar pliku używając MultipartFile ' s getOriginalFilename() i getSize().

Testowałem to w wersji wiosennej 4.1.1.RELEASE.

 26
Author: Amila,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-26 12:39:53

Bez komponentu lub biblioteki zewnętrznej w Tomcat 6 o 7

Włączanie uploadu w sieci .plik 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>

JAK WIDAĆ :

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

Przesyłanie plików za pomocą JSP. Pliki:

w pliku 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=""/>

w pliku JSP lub Servlet

    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();

Edytuj kod zgodnie z wymaganiami servleta, np. max-file-size, max-request-size i inne opcje, które możesz ustawić...

 12
Author: joseluisbz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-25 05:44:54

Potrzebujesz pliku common-io.1.4.jar do katalogu lib, lub jeśli pracujesz w dowolnym edytorze, takim jak NetBeans, musisz przejść do właściwości projektu i po prostu dodać plik JAR i będzie po wszystkim.

Aby uzyskać plik common.io.jar Wystarczy go wygooglować lub po prostu przejść do strony Apache Tomcat , gdzie masz opcję darmowego pobrania tego pliku. Ale pamiętaj o jednym: Pobierz binarny plik ZIP, jeśli jesteś użytkownikiem systemu Windows.

 11
Author: Pranav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-03 12:25:19

Używam common Servlet dla KAŻDEGO formularza Html, niezależnie od tego, czy zawiera załączniki, czy nie. Ten Servlet zwraca TreeMap Gdzie kluczami są parametry nazwy jsp, a wartości są wejściami użytkownika i zapisuje wszystkie załączniki w katalogu fixed, a później zmieniasz nazwę wybranego katalogu.Tutaj połączenia to nasz niestandardowy interfejs mający obiekt połączenia. Myślę, że to ci pomoże

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;
    }
}
 9
Author: feel good and programming,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-09 22:39:41

Dla Spring MVC Od kilku godzin próbuję to zrobić. i udało się mieć prostszą wersję, która działała do wprowadzania form zarówno danych, jak i obrazu.

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

Kontroler do obsługi

@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");
    }
}

Mam nadzieję, że pomoże:)

 8
Author: Shivangi Gupta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-15 19:42:10

Inne źródło tego problemu występuje, jeśli używasz Geronimo z wbudowanym Tomcat. W tym przypadku, po wielu iteracjach testowania commons-io i commons-fileupload, problem powstaje z powodu nadrzędnego classloadera obsługującego commons-xxx jars. Należy temu zapobiec. Wypadek zawsze miał miejsce w:

fileItems = uploader.parseRequest(request);

Zauważ, że typ listy fileItems zmienił się wraz z obecną wersją commons-fileupload na List<FileItem> w przeciwieństwie do poprzednich wersji, gdzie był generic List.

Dodałem kod źródłowy commons-fileupload i commons-io do mojego projektu Eclipse, aby prześledzić rzeczywisty błąd i w końcu dostałem trochę wglądu. Po pierwsze, rzucony wyjątek jest typu Throwable, a nie podany FileIOException, ani nawet wyjątek (nie zostaną one uwięzione). Po drugie, komunikat o błędzie jest zaciemniający, ponieważ określa klasę not found, ponieważ axis2 nie może znaleźć commons-io. Axis2 nie jest w ogóle używany w moim projekcie, ale istnieje jako folder w Geronimo podkatalog repozytorium jako część standardowej instalacji.

W końcu znalazłem 1 miejsce, które stanowiło działające rozwiązanie, które z powodzeniem rozwiązało mój problem. W planie wdrażania należy ukryć słoiki przed nadrzędnym programem ładującym. To zostało umieszczone w geronimo-web.xml z moim pełnym plikiem pokazanym poniżej.

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>
 6
Author: Geoffrey Malafsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-10 15:15:52

Oto przykład użycia 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
Author: thouliha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-21 16:49:16

Najpierw musisz ustawić atrybut enctype formularza na "multipart / form-data"

Jest to pokazane poniżej.

<form action="Controller" method="post" enctype="multipart/form-data">
     <label class="file-upload"> Click here to upload an Image </label>
     <input type="file" name="file" id="file" required> 
</form>

A następnie w Servlecie "Controller" dodaj adnotację dla wieloczęściowej, aby wskazać, że dane wieloczęściowe są przetwarzane w servlecie.

Po wykonaniu tej czynności pobiera część wysłaną przez formularz, a następnie pobiera nazwę pliku (ze ścieżką)przesłanego pliku. Użyj tego, aby utworzyć nowy plik w żądanej ścieżce i zapisać części pliku do nowo utworzony plik do odtworzenia pliku.

Jak pokazano poniżej:

@MultipartConfig

public class Controller extends HttpServlet {

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

    private void addProduct(HttpServletRequest request, HttpServletResponse response) {
        Part filePart = request.getPart("file");
        String imageName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString();

        String imageSavePath = "specify image path to save image"; //path to save image
        FileOutputStream outputStream = null;
        InputStream fileContent = null;

        try {
            outputStream = new FileOutputStream(new File(imageSavePath + File.separator + imageName));
            //creating a new file with file path and the file name
            fileContent = filePart.getInputStream();
            //getting the input stream
            int readBytes = 0;
            byte[] readArray = new byte[1024];
            //initializing a byte array with size 1024

            while ((readBytes = fileContent.read(readArray)) != -1) {
                outputStream.write(readArray, 0, readBytes);
            }//this loop will write the contents of the byte array unitl the end to the output stream
        } catch (Exception ex) {
            System.out.println("Error Writing File: " + ex);
        } finally {
            if (outputStream != null) {
                outputStream.close();
                //closing the output stream
            }
            if (fileContent != null) {
                fileContent.close();
                //clocsing the input stream
            }
        }
    }
}
 0
Author: Lakindu Hewawasam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-24 10:49:02

Możesz przesłać plik używając jsp / servlet.

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

Po drugiej stronie serwera. użyj poniższego kodu.

     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
Author: Mitul Maheshwari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-04 10:00:31
DiskFileUpload upload=new DiskFileUpload();

Z tego obiektu należy pobrać elementy pliku i pola, a następnie zapisać je na serwerze w następujący sposób:

String loc="./webapps/prjct name/server folder/"+contentid+extension;
File uploadFile=new File(loc);
item.write(uploadFile);
 -1
Author: Mahender Reddy Yasa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-07 22:28:44

Najprostszy sposób mógłby wymyślić dla plików i kontrolek wejściowych, w/out miliard bibliotek:

  <%
  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
Author: access_granted,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-26 06:13:52

Wysyłanie wielu plików do pliku musimy użyć enctype="multipart/form-data"
aby wysłać wiele plików użyj multiple="multiple" w znaczniku input

<form action="upload" method="post" enctype="multipart/form-data">
 <input type="file" name="fileattachments"  multiple="multiple"/>
 <input type="submit" />
</form>
 -2
Author: rohan kamat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-27 04:33:38

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

PLIK SERVLET

// 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.");
   } 
}

Www.xml

Skompiluj powyżej Servlet UploadServlet i utwórz wymagany wpis W web.plik xml w następujący sposób.

<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>
 -2
Author: Himanshu Patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-15 13:28:57