Bagaimana cara mengunggah file ke server menggunakan JSP / Servlet?

688

Bagaimana saya bisa mengunggah file ke server menggunakan JSP / Servlet? Saya mencoba ini:

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

Namun, saya hanya mendapatkan nama file, bukan konten file. Ketika saya menambahkan enctype="multipart/form-data"ke <form>, lalu request.getParameter()kembali null.

Selama penelitian saya menemukan Apache Common FileUpload . Saya mencoba ini:

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

Sayangnya, servlet melempar pengecualian tanpa pesan dan sebab yang jelas. Inilah 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)
Thang Pham
sumber
Mungkin artikel ini akan membantu: baeldung.com/upload-file-servlet
Adam Gerard

Jawaban:

1193

pengantar

Untuk menelusuri dan memilih file untuk diunggah, Anda perlu <input type="file">bidang HTML dalam formulir. Seperti yang dinyatakan dalam spesifikasi HTML Anda harus menggunakan POSTmetode dan enctypeatribut formulir harus diatur "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>

Setelah mengirimkan formulir seperti itu, data formulir multi-biner tersedia di badan permintaan dalam format yang berbeda dari ketika enctypetidak diatur.

Sebelum Servlet 3.0, Servlet API tidak mendukung secara asli multipart/form-data. Ini hanya mendukung bentuk standar dari application/x-www-form-urlencoded. The request.getParameter()dan permaisuri akan semua kembali nullbila menggunakan data formulir multi. Di sinilah FileUpload Apache Commons yang terkenal muncul.

Jangan parsing secara manual!

Secara teori Anda dapat menguraikan tubuh permintaan sendiri berdasarkan ServletRequest#getInputStream(). Namun, ini adalah pekerjaan yang tepat dan membosankan yang membutuhkan pengetahuan yang akurat tentang RFC2388 . Anda tidak boleh mencoba melakukan ini sendiri atau menyalin beberapa kode pustaka buatan sendiri yang ditemukan di tempat lain di Internet. Banyak sumber online gagal dalam hal ini, seperti roseindia.net. Lihat juga mengunggah file pdf . Anda sebaiknya menggunakan perpustakaan asli yang digunakan (dan diuji secara implisit!) Oleh jutaan pengguna selama bertahun-tahun. Perpustakaan seperti itu telah membuktikan kekokohannya.

Saat Anda sudah menggunakan Servlet 3.0 atau yang lebih baru, gunakan API asli

Jika Anda menggunakan setidaknya Servlet 3.0 (Tomcat 7, Jetty 9, JBoss AS 6, GlassFish 3, dll), maka Anda dapat menggunakan API standar yang disediakan HttpServletRequest#getPart()untuk mengumpulkan item data formulir multi-individu (kebanyakan implementasi Servlet 3.0 sebenarnya menggunakan Apache Commons FileUpload di bawah sampul untuk ini!). Juga, bidang formulir normal tersedia dengan getParameter()cara biasa.

Pertama, @MultipartConfigberi anotasi pada servlet Anda agar dapat mengenali dan mendukung multipart/form-datapermintaan dan mulai getPart()bekerja:

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

Kemudian, implementasikan doPost()sebagai berikut:

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

Perhatikan Path#getFileName(). Ini adalah perbaikan MSIE untuk mendapatkan nama file. Browser ini salah mengirim jalur file lengkap di sepanjang nama, bukan hanya nama file.

Jika Anda memiliki <input type="file" name="file" multiple="true" />unggahan multi-file, kumpulkan sebagai berikut (sayangnya tidak ada metode seperti itu 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)
    }
}

Saat Anda belum menggunakan Servlet 3.1, dapatkan nama file yang dikirimkan secara manual

Catatan yang Part#getSubmittedFileName()diperkenalkan di Servlet 3.1 (Tomcat 8, Jetty 9, WildFly 8, GlassFish 4, dll). Jika Anda belum menggunakan Servlet 3.1, maka Anda memerlukan metode utilitas tambahan untuk mendapatkan nama file yang dikirimkan.

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

Perhatikan perbaikan MSIE untuk mendapatkan nama file. Browser ini salah mengirim jalur file lengkap di sepanjang nama, bukan hanya nama file.

Saat Anda belum menggunakan Servlet 3.0, gunakan Apache Commons FileUpload

Jika Anda belum menggunakan Servlet 3.0 (bukankah ini saatnya untuk memutakhirkan?), Praktik umum adalah menggunakan Apache Commons FileUpload untuk menguraikan permintaan data formulir multi-bagian. Ini memiliki Panduan Pengguna dan FAQ yang sangat baik (hati-hati melalui keduanya). Ada juga O'Reilly (" cos ") MultipartRequest, tetapi ia memiliki beberapa bug (minor) dan tidak aktif lagi selama bertahun-tahun. Saya tidak akan merekomendasikan menggunakannya. Apache Commons FileUpload masih dipelihara secara aktif dan saat ini sangat matang.

Untuk menggunakan FileUpload Apache Commons, Anda harus memiliki setidaknya file berikut di aplikasi web Anda /WEB-INF/lib:

Upaya awal Anda kemungkinan besar gagal karena Anda lupa IO milik bersama.

Berikut ini contoh kickoff bagaimana tampilan doPost()Anda UploadServletsaat menggunakan 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);
    }

    // ...
}

Ini sangat penting bahwa Anda tidak menelepon getParameter(), getParameterMap(), getParameterValues(), getInputStream(), getReader(), dll pada permintaan yang sama sebelumnya. Jika tidak, wadah servlet akan membaca dan mem-parsing badan permintaan dan dengan demikian Apache Commons FileUpload akan mendapatkan badan permintaan kosong. Lihat juga ao ServletFileUpload # parseRequest (request) mengembalikan daftar kosong .

Perhatikan FilenameUtils#getName(). Ini adalah perbaikan MSIE untuk mendapatkan nama file. Browser ini salah mengirim jalur file lengkap di sepanjang nama, bukan hanya nama file.

Atau Anda juga dapat membungkus semua ini dengan cara Filtermem-parsing semuanya secara otomatis dan memasukkan barang-barang itu kembali ke dalam parametermap permintaan sehingga Anda dapat terus menggunakan request.getParameter()cara biasa dan mengambil file yang diunggah request.getAttribute(). Anda dapat menemukan contoh di artikel blog ini .

Solusi untuk bug GlassFish3 getParameter()masih kembalinull

Perhatikan bahwa versi Glassfish yang lebih tua dari 3.1.2 memiliki bug di mana getParameter()masih kembali null. Jika Anda menargetkan wadah seperti itu dan tidak dapat memutakhirkannya, maka Anda perlu mengekstraksi nilainya getPart()dengan bantuan metode utilitas ini:

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

Menyimpan file yang diunggah (jangan gunakan getRealPath()juga part.write()!)

Buka jawaban berikut untuk perincian tentang cara menyimpan dengan benar yang diperoleh InputStream( fileContentvariabel seperti yang ditunjukkan dalam cuplikan kode di atas) ke disk atau basis data:

Melayani file yang diunggah

Buka jawaban berikut untuk detail tentang penyajian file yang disimpan dengan benar dari disk atau database kembali ke klien:

Ajaxifying formulir

Buka jawaban berikut cara mengunggah menggunakan Ajax (dan jQuery). Perhatikan bahwa kode servlet untuk mengumpulkan data formulir tidak perlu diubah untuk ini! Hanya cara Anda merespons yang dapat diubah, tetapi ini agak sepele (yaitu alih-alih meneruskan ke JSP, cukup cetak beberapa JSON atau XML atau bahkan teks biasa tergantung pada apa pun yang diharapkan skrip yang bertanggung jawab atas panggilan Ajax).


Semoga ini semua membantu :)

BalusC
sumber
Ah maaf, saya melihat request.getParts("file")dan bingung x_x
Kagami Sascha Rosylight
Dengan Servlet 3.0, jika suatu MultipartConfigkondisi dilanggar (mis maxFileSize.:), panggilan request.getParameter()mengembalikan null. Apakah ini sengaja? Bagaimana jika saya mendapatkan beberapa parameter (teks) biasa sebelum memanggil getPart(dan memeriksa IllegalStateException)? Ini menyebabkan sebuah NullPointerExceptionuntuk dilempar sebelum saya memiliki kesempatan untuk memeriksa IllegalStateException.
theyuv
@BalusC Saya membuat posting yang berkaitan dengan ini, apakah Anda mempunyai ide bagaimana saya bisa mengambil info tambahan dari File API webKitDirectory. Lebih detail di sini stackoverflow.com/questions/45419598/…
Rapster
Jika Anda tidak menggunakan Servlet 3.0 dan menggunakan trik FileUpload, saya menemukan Anda tidak dapat membaca file dari permintaan lebih dari sekali. Jika Anda membutuhkan fungsi ini, Anda mungkin ingin melihat Spring's MultiPartFilter. Posting ini memiliki contoh kerja yang baik: stackoverflow.com/a/21448087/1048376
splashout
1
Ya, jika seseorang mencoba menggunakan kode di bagian 3.0 dengan tomcat 7, mereka mungkin menghadapi masalah di String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.bagian yang mirip dengan saya
raviraja
26

Jika Anda menggunakan Spring MVC, ini adalah caranya: (Saya meninggalkan ini di sini kalau-kalau ada yang merasa berguna).

Gunakan formulir dengan enctypeatribut yang disetel ke " multipart/form-data" (Sama seperti BalusC's Answer)

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

Di controller Anda, petakan parameter permintaan fileuntuk MultipartFilemengetik sebagai berikut:

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

Anda bisa mendapatkan nama file dan ukuran menggunakan MultipartFile's getOriginalFilename()dan getSize().

Saya sudah menguji ini dengan versi Spring 4.1.1.RELEASE.

Amila
sumber
Jika saya tidak salah, ini mengharuskan Anda mengkonfigurasi kacang di konfigurasi aplikasi server Anda ...
Kenny Worden
11

Anda perlu common-io.1.4.jarfile untuk dimasukkan dalam libdirektori Anda , atau jika Anda bekerja di editor apa pun, seperti NetBeans, maka Anda harus pergi ke properti proyek dan cukup tambahkan file JAR dan Anda akan selesai.

Untuk mendapatkan common.io.jarfile tersebut, cukup google saja atau buka situs web Apache Tomcat di mana Anda mendapatkan opsi untuk mengunduh file ini secara gratis. Tapi ingat satu hal: unduh file ZIP biner jika Anda pengguna Windows.

Pranav
sumber
Tidak dapat menemukan .jartapi .zip. Apakah yang Anda maksud .zip?
Malwinder Singh
10

Tanpa komponen atau Perpustakaan eksternal di Tomcat 6 o 7

Mengaktifkan Unggahan dalam file 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>

YANG BISA ANDA LIHAT :

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

Mengunggah File menggunakan JSP. File:

Dalam file 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=""/>

Dalam File atau Servlet 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();

Edit kode Anda ke persyaratan servlet, seperti ukuran file maksimum , ukuran permintaan maksimum dan opsi lain yang dapat Anda atur ...

joseluisbz
sumber
9

Saya Menggunakan Servlet umum untuk setiap Formulir Html apakah memiliki lampiran atau tidak. Servlet ini mengembalikan tempat di TreeMapmana kuncinya adalah nama jsp Parameter dan nilai adalah Input Pengguna dan menyimpan semua lampiran dalam direktori tetap dan kemudian Anda mengganti nama direktori pilihan Anda. Koneksi di sini adalah antarmuka khusus kami yang memiliki objek koneksi. Saya pikir ini akan membantu Anda

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;
    }
}
merasa baik dan pemrograman
sumber
@buhake sindi hei apa yang seharusnya menjadi filepath jika saya menggunakan server langsung atau saya menjalankan proyek saya dengan mengunggah file ke server
AmanS
2
Setiap direktori di server hidup. Jika Anda menulis kode untuk membuat direktori di servlet maka direktori akan dibuat di live srver
merasa baik dan pemrograman
8

Untuk Spring MVC saya telah mencoba selama berjam-jam untuk melakukan ini dan berhasil memiliki versi yang lebih sederhana yang berfungsi untuk mengambil input formulir baik data dan gambar.

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

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

Semoga bermanfaat :)

Shivangi Gupta
sumber
Bisakah Anda berbagi bentuk gambar pilih db mysql dan menunjukkannya di jsp / html?
Ved Prakash
6

Sumber lain dari masalah ini terjadi jika Anda menggunakan Geronimo dengan Tomcat yang disematkan. Dalam hal ini, setelah banyak iterasi pengujian commons-io dan commons-fileupload, masalah muncul dari classloader induk yang menangani guci commons-xxx. Ini harus dicegah. Kecelakaan selalu terjadi di:

fileItems = uploader.parseRequest(request);

Perhatikan bahwa tipe daftar fileItems telah berubah dengan versi saat ini dari commons-fileupload menjadi khusus List<FileItem>sebagai lawan dari versi sebelumnya di mana itu generik List.

Saya menambahkan kode sumber untuk commons-fileupload dan commons-io ke proyek Eclipse saya untuk melacak kesalahan aktual dan akhirnya mendapatkan beberapa wawasan. Pertama, pengecualian yang dilemparkan adalah tipe Throwable bukan FileIOException yang disebutkan atau bahkan Exception (ini tidak akan terjebak). Kedua, pesan kesalahan membingungkan karena menyatakan kelas tidak ditemukan karena axis2 tidak dapat menemukan commons-io. Axis2 tidak digunakan dalam proyek saya sama sekali tetapi ada sebagai folder di subdirektori repositori Geronimo sebagai bagian dari instalasi standar.

Akhirnya, saya menemukan 1 tempat yang menghadirkan solusi kerja yang berhasil menyelesaikan masalah saya. Anda harus menyembunyikan guci dari pemuat induk dalam rencana penerapan. Ini dimasukkan ke geronimo-web.xml dengan file lengkap saya yang ditunjukkan di bawah ini.

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>
Geoffrey Malafsky
sumber
0

Berikut ini contoh menggunakan 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);
thouliha
sumber
0

Cara paling sederhana bisa muncul untuk file dan kontrol input, tanpa satu miliar perpustakaan:

  <%
  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);
  %>
access_granted
sumber
-1

Anda dapat mengunggah file menggunakan jsp / servlet.

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

di sisi server sisi lain. gunakan kode berikut.

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

}
Mitul Maheshwari
sumber
-1
DiskFileUpload upload=new DiskFileUpload();

Dari objek ini Anda harus mendapatkan item file dan bidang kemudian Anda dapat menyimpan ke server seperti yang diikuti:

String loc="./webapps/prjct name/server folder/"+contentid+extension;
File uploadFile=new File(loc);
item.write(uploadFile);
Mahender Reddy Yasa
sumber
-2

Mengirim beberapa file untuk file yang harus kita gunakan enctype="multipart/form-data"
dan untuk mengirim banyak file multiple="multiple"dalam tag input

<form action="upload" method="post" enctype="multipart/form-data">
 <input type="file" name="fileattachments"  multiple="multiple"/>
 <input type="submit" />
</form>
rohan kamat
sumber
2
Bagaimana cara kita melakukan getPart ("fileattachments") sehingga kita mendapatkan array dari Bagian? Saya pikir getPart untuk banyak file tidak akan berfungsi?
CyberMew
-2

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

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

web.xml

Kompilasi UploadServlet servlet di atas dan buat entri yang diperlukan dalam file web.xml sebagai berikut.

<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>
Himanshu Patel
sumber