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


688

Jak mogę wgrać pliki na serwer za pomocą 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 treść pliku. Kiedy dodam enctype="multipart/form-data"do <form>, następnie request.getParameter()wraca 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 serwlet zgłosił 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)

Być może ten artykuł będzie pomocny: baeldung.com/upload-file-servlet
Adam Gerard

Odpowiedzi:


1193

Wprowadzenie

Aby przeglądać i wybrać plik do przesłania, potrzebujesz <input type="file">pola HTML w formularzu. Jak podano w specyfikacji HTML , musisz użyć POSTmetody, a enctypeatrybut 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 binarne dane wieloczęściowego formularza są dostępne w treści żądania w innym formacie niż wtedy, gdy enctypenie jest ustawiony.

Przed serwletem 3.0 interfejs API serwletów nie obsługiwał natywnie multipart/form-data. Obsługuje tylko domyślny typ formularza application/x-www-form-urlencoded. Wszyscy request.getParameter()i małżonkowie wróciliby, nullgdy użyli danych wieloczęściowych. To tutaj pojawił się dobrze znany plik Apache Commons FileUpload .

Nie parsuj go ręcznie!

Teoretycznie możesz samodzielnie przeanalizować treść żądania ServletRequest#getInputStream(). Jest to jednak dokładna i żmudna praca, która wymaga dokładnej znajomości RFC2388 . Nie powinieneś próbować tego robić samemu lub kopiować własnego kodu bez biblioteki znalezionego gdzie indziej w Internecie. Wiele źródeł internetowych zawiodło w tym mocno, takich jak roseindia.net. Zobacz także przesyłanie pliku pdf . Powinieneś raczej używać prawdziwej biblioteki, która jest używana (i domyślnie testowana!) Przez miliony użytkowników od lat. Taka biblioteka dowiodła swojej solidności.

Jeśli korzystasz już z Servlet 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.), Możesz po prostu użyć standardowego interfejsu API podanego HttpServletRequest#getPart()do zbierania poszczególnych elementów danych formularza wieloczęściowego (większość implementacji Servlet 3.0 faktycznie używa Apache Plik Commons Załaduj pod przykryciem!). Ponadto zwykłe pola formularza są dostępne getParameter()w zwykły sposób.

Najpierw dodaj adnotację do serwletu @MultipartConfig, aby umożliwić mu rozpoznawanie i obsługę multipart/form-datażądań, a tym samym getPart()rozpoczęcie pracy:

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

Następnie zaimplementuj go 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)
}

Uwaga Path#getFileName(). Jest to poprawka MSIE dotycząca uzyskiwania nazwy pliku. Ta przeglądarka niepoprawnie wysyła pełną ścieżkę pliku wzdłuż nazwy zamiast samej nazwy pliku.

Jeśli masz możliwość <input type="file" name="file" multiple="true" />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)
    }
}

Jeśli nie korzystasz jeszcze z serwletu 3.1, ręcznie pobierz przesłaną nazwę pliku

Uwaga: Part#getSubmittedFileName()została wprowadzona w Servlet 3.1 (Tomcat 8, Jetty 9, WildFly 8, GlassFish 4 itp.). Jeśli nie korzystasz jeszcze z serwletu 3.1, potrzebujesz dodatkowej metody narzędzia, aby uzyskać nazwę przesłanego 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ą uzyskiwania nazwy pliku. Ta przeglądarka niepoprawnie wysyła pełną ścieżkę pliku wzdłuż nazwy zamiast samej nazwy pliku.

Jeśli nie korzystasz jeszcze z Servlet 3.0, użyj Apache Commons FileUpload

Jeśli nie korzystasz jeszcze z Servlet 3.0 (czy nie czas na aktualizację?), Powszechną praktyką jest używanie Apache Commons FileUpload do analizowania żądań danych formularza wieloczęściowego. Ma doskonałą instrukcję obsługi i często zadawane pytania (dokładnie przejrzyj oba). Jest też O'Reilly („ cos ”) MultipartRequest, ale ma kilka (drobnych) błędów i nie jest już aktywnie utrzymywany przez lata. Nie polecałbym tego używać. Plik Apache Commons FileUpload jest nadal aktywnie utrzymywany i obecnie bardzo dojrzały.

Aby korzystać z Apache Commons FileUpload, musisz mieć co najmniej następujące pliki w swojej aplikacji internetowej /WEB-INF/lib:

Twoja pierwsza próba nie powiodła się najprawdopodobniej, ponieważ zapomniałeś o wspólnym We / Wy.

Oto przykładowy przykład tego, jak może wyglądać doPost()twój UploadServletpodczas używania 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, aby nie dzwonić getParameter(), getParameterMap(), getParameterValues(), getInputStream(), getReader(), itp na ten sam wniosek wcześniej. W przeciwnym razie kontener serwletu odczyta i przeanalizuje treść żądania, a zatem Apache Commons FileUpload otrzyma pustą treść żądania. Zobacz także ao ServletFileUpload # parseRequest (request) zwraca pustą listę .

Uwaga FilenameUtils#getName(). Jest to poprawka MSIE dotycząca uzyskiwania nazwy pliku. Ta przeglądarka niepoprawnie wysyła pełną ścieżkę pliku wzdłuż nazwy zamiast samej nazwy pliku.

Alternatywnie możesz również zawinąć to wszystko w Filterparsowanie wszystkiego w sposób automatyczny i umieścić rzeczy z powrotem w parametryzacji żądania, abyś mógł nadal używać request.getParameter()zwykłego sposobu i pobierać przesłany plik request.getAttribute(). Możesz znaleźć przykład w tym artykule na blogu .

Obejście problemu z błędem GlassFish3, który getParameter()wciąż powracanull

Należy pamiętać, że starsze niż GlassFish wersje 3.1.2 miałem błąd przy czym getParameter()powraca jeszcze null. Jeśli celujesz w taki kontener i nie możesz go zaktualizować, musisz wyodrębnić wartość getPart()za pomocą tej metody narzędzia:

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 zapisywania uzyskanej InputStream( fileContentzmiennej, jak pokazano w powyższych fragmentach kodu) na dysk lub bazę danych:

Udostępnianie przesłanego pliku

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

Ajaxifying the form

Przejdź do poniższych odpowiedzi na temat przesyłania za pomocą Ajax (i jQuery). Należy pamiętać, że kod serwletu do gromadzenia danych formularza nie musi być w tym celu zmieniany! Można zmienić tylko sposób, w jaki reagujesz, ale jest to raczej trywialne (tj. Zamiast przekierowywać do JSP, po prostu wydrukuj trochę JSON lub XML, a 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 :)


Ach, przepraszam, widziałem request.getParts("file")i byłem zdezorientowany x_x
Kagami Sascha Rosylight

W Servlet 3.0, jeśli MultipartConfigwarunek zostanie naruszony (np . maxFileSize:), wywołanie request.getParameter()zwraca null. Czy to celowo? Co się stanie, jeśli otrzymam jakieś zwykłe parametry (tekstowe) przed wywołaniem getPart(i sprawdzeniem IllegalStateException)? Powoduje to NullPointerExceptionwyrzucenie a, zanim mam szansę sprawdzić IllegalStateException.
oni

@BalusC Stworzyłem związany z tym post, czy masz pomysł, jak mogę pobrać dodatkowe informacje z interfejsu API FileKitDirectory. Więcej szczegółów tutaj stackoverflow.com/questions/45419598/…
Rapster

Jeśli nie korzystasz z Servlet 3.0 i używasz sztuczki FileUpload, okazało się, że nie możesz odczytać pliku z żądania więcej niż raz. Jeśli potrzebujesz tej funkcji, możesz spojrzeć na MultiPartFilter firmy Spring. Ten post ma dobry przykład działania: stackoverflow.com/a/21448087/1048376
splashout

1
Tak, jeśli ktoś spróbuje użyć kodu w sekcji 3.0 z tomcat 7, może napotkać problem String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.częściowo podobny do mnie
raviraja

26

Jeśli zdarzy ci się używać Spring MVC, wykonaj następujące czynności: (Zostawiam to tutaj, na wypadek, gdyby ktoś uznał to za przydatne).

Użyj formularza z enctypeatrybutem ustawionym na „ multipart/form-data” (Taki sam jak odpowiedź BalusC)

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

W kontrolerze zamapuj parametr żądania, fileaby MultipartFilewpisać 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ę pliku i rozmiar za pomocą MultipartFile's getOriginalFilename()i getSize().

Przetestowałem to w wersji wiosennej 4.1.1.RELEASE.


Jeśli się nie mylę, wymaga to skonfigurowania komponentu bean w konfiguracji aplikacji na serwerze ...
Kenny Worden,

11

Musisz common-io.1.4.jardołączyć plik do swojego libkatalogu 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 gotowe.

Aby uzyskać common.io.jarplik, po prostu google go lub po prostu przejdź do strony internetowej Apache Tomcat, gdzie można bezpłatnie pobrać ten plik. Pamiętaj jednak o jednej rzeczy: pobierz binarny plik ZIP, jeśli jesteś użytkownikiem systemu Windows.


Nie mogę znaleźć, .jarale .zip. Czy masz na myśli .zip?
Malwinder Singh

10

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

Włączanie przesyłania w pliku 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>

JAK MOŻESZ ZOBACZYĆ :

    <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. Akta:

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 serwletu

    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, aby spełnić wymagania serwletu, takie jak maksymalny rozmiar pliku , maksymalny rozmiar żądania i inne opcje, które możesz ustawić ...


9

Używam wspólnego serwletu dla każdego formularza HTML, niezależnie od tego, czy zawiera on załączniki, czy nie. Ten serwlet zwraca miejsce, w TreeMapktórym klucze to nazwa jsp Parametry i wartości to Dane wejściowe użytkownika i zapisuje wszystkie załączniki w ustalonym katalogu, a następnie zmieniasz nazwę wybranego katalogu. Oto Połączenia to nasz niestandardowy interfejs posiadają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;
    }
}

@buhake sindi hej, jaka powinna być ścieżka do pliku, jeśli korzystam z serwera na żywo lub
realizuję

2
Dowolny katalog na live server. Jeśli napiszesz kod, aby utworzyć katalog w serwlecie, katalog zostanie utworzony w live srver
czuj się dobrze i programuj

8

W przypadku Spring MVC próbowałem to zrobić od wielu godzin i udało mi się stworzyć prostszą wersję, która działała na zasadzie wprowadzania danych 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 to pomoże :)


Czy możesz udostępnić wybraną formę obrazu db mysql i pokazać go na jsp / html?
Ved Prakash

6

Inne źródło tego problemu występuje, jeśli używasz Geronimo z osadzonym Tomcat. W takim przypadku po wielu iteracjach testowania commons-io i commons-fileupload problem pojawia się w nadrzędnym module ładującym obsługującym słoiki commons-xxx. Trzeba temu zapobiec. Awaria zawsze występowała o:

fileItems = uploader.parseRequest(request);

Zauważ, że typ listy fileItems zmienił się wraz z bieżącą wersją pliku commons-fileupload, w szczególności List<FileItem>w przeciwieństwie do poprzednich wersji, w których był ogólny List.

Dodałem kod źródłowy commons-fileupload i commons-io do mojego projektu Eclipse, aby prześledzić rzeczywisty błąd i wreszcie uzyskałem wgląd. Po pierwsze, zgłoszony wyjątek jest typu Throwable, a nie podany wyjątek FileIOException, a nawet wyjątek (nie zostaną one uwięzione). Po drugie, komunikat o błędzie jest nieprzejrzysty, ponieważ stwierdził, że nie znaleziono klasy, ponieważ oś 2 nie mogła znaleźć towaru wspólnego. Axis2 nie jest w ogóle używany w moim projekcie, ale istnieje jako folder w podkatalogu repozytorium Geronimo w ramach standardowej instalacji.

Wreszcie znalazłem 1 miejsce, w którym znalazłem działające rozwiązanie, które z powodzeniem rozwiązało mój problem. Musisz ukryć słoiki przed nadrzędnym modułem ładującym w planie wdrażania. Zostało to 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>

0

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

Najprostszym sposobem jest wymyślenie plików i kontrolek wejściowych, bez miliarda 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

możesz przesłać plik za pomocą jsp / servlet.

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

z drugiej strony po stronie serwera. użyj następującego 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
DiskFileUpload upload=new DiskFileUpload();

Z tego obiektu musisz pobrać elementy pliku i pola, które następnie możesz zapisać 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);

-2

Wysyłając wiele plików do pliku, musimy użyć enctype="multipart/form-data"
i wysłać wiele plików multiple="multiple"w tagu wejściowym

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

2
Jak moglibyśmy zrobić getPart („załączniki plików”), aby zamiast tego uzyskać tablicę części? Nie sądzę, aby getPart dla wielu plików działał?
CyberMew

-2

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 SERWERA

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

Skompiluj powyższy serwlet UploadServlet i utwórz wymagany wpis w pliku web.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>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.