JSP / Servlet kullanarak dosyaları sunucuya nasıl yükleyebilirim?


688

JSP / Servlet kullanarak dosyaları sunucuya nasıl yükleyebilirim? Bunu denedim:

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

Ancak, sadece dosya adını alıyorum, dosya içeriğini değil. Ben eklediğinizde enctype="multipart/form-data"için <form>, o request.getParameter()dönenenull .

Araştırma sırasında Apache Common FileUpload ile karşılaştım . Bunu denedim:

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

Ne yazık ki, sunucu uygulaması açık bir mesaj ve neden olmadan bir istisna attı. İşte yığın izlemesi:

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)

Belki de bu makale yardımcı olacaktır: baeldung.com/upload-file-servlet
Adam Gerard

Yanıtlar:


1193

Giriş

Yüklenecek bir dosyaya göz atmak ve seçmek <input type="file">için formda bir HTML alanına ihtiyacınız vardır . HTML spesifikasyonunda belirtildiği gibi , POSTyöntemi kullanmanız ve enctypeformun niteliğinin ayarlanması gerekir "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>

Bu tür bir form gönderdikten sonra, ikili çok parçalı bir şekilde veri istek vücutta mevcut olan farklı bir biçimde olduğundan dahaenctype ayarlanmadı.

Servlet 3.0'dan önce, Servlet API'si yerel olarak desteklemiyordu multipart/form-data. Yalnızca varsayılan form şifrelemesini destekler application/x-www-form-urlencoded. request.getParameter()Ve eşleri tüm iade ediyorum nullçok parçalı form verilerini kullanırken. Tanınmış Apache Commons FileUpload burada devreye giriyor.

Elle ayrıştırmayın!

Teorik olarak, istek gövdesini kendinize dayalı olarak ayrıştırabilirsiniz ServletRequest#getInputStream(). Ancak, bu RFC2388 hakkında kesin bilgi gerektiren hassas ve sıkıcı bir çalışmadır . Bunu kendi başınıza yapmaya çalışmamalı veya İnternet'in başka bir yerinde bulunan kütüphaneden bağımsız bazı kodları kopyalamaya çalışmamalısınız. Birçok çevrimiçi kaynak bu konuda çok başarısız oldu, örneğin roseindia.net. Ayrıca bkz . Pdf dosyası yükleme . Milyonlarca kullanıcı tarafından yıllarca kullanılan (ve dolaylı olarak test edilen!) Gerçek bir kütüphane kullanmayı tercih etmelisiniz. Böyle bir kütüphane sağlamlığını kanıtlamıştır.

Zaten Servlet 3.0 veya daha yeni bir sürümdeyseniz, yerel API kullanın

En az Servlet 3.0 (Tomcat 7, Jetty 9, JBoss AS 6, GlassFish 3, vb.) Kullanıyorsanız HttpServletRequest#getPart(), tek tek çok parçalı form veri öğelerini toplamak için sağlanan standart API'yi kullanabilirsiniz (çoğu Servlet 3.0 uygulaması aslında Apache kullanır Bunun için kapakların altında Commons FileUpload!). Ayrıca, normal form alanları getParameter()normal şekilde kullanılabilir.

İlk önce sunucu uygulamanıza, istekleri @MultipartConfigtanıması ve desteklemesi multipart/form-datave böylece getPart()çalışmaya başlaması için açıklama ekleyin :

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

Ardından, doPost()aşağıdaki gibi uygulayın :

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

Not edin Path#getFileName(). Bu dosya adını almak için bir MSIE düzeltmedir. Bu tarayıcı, yalnızca dosya adı yerine tam dosya yolunu ad boyunca yanlış gönderir.

Eğer bir var <input type="file" name="file" multiple="true" />, çoklu dosya yükleme için aşağıda onları toplamak (maalesef böyle bir yöntem olarak yoktur 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)
    }
}

Henüz Servlet 3.1'de değilseniz, gönderilen dosya adını el ile alın

Not Part#getSubmittedFileName()Servlet 3.1 (Tomcat'e 8, iskelesi 9, WildFly 8, GlassFish'in 4, vs) tanıtıldı. Henüz Servlet 3.1'de değilseniz, gönderilen dosya adını almak için ek bir yardımcı program yöntemine ihtiyacınız vardır.

private static String getSubmittedFileName(Part part) {
    for (String cd : part.getHeader("content-disposition").split(";")) {
        if (cd.trim().startsWith("filename")) {
            String fileName = cd.substring(cd.indexOf('=') + 1).trim().replace("\"", "");
            return fileName.substring(fileName.lastIndexOf('/') + 1).substring(fileName.lastIndexOf('\\') + 1); // MSIE fix.
        }
    }
    return null;
}
String fileName = getSubmittedFileName(filePart);

MSIE düzeltmesini, dosya adını alma konusunda not alın. Bu tarayıcı, yalnızca dosya adı yerine tam dosya yolunu ad boyunca yanlış gönderir.

Henüz Servlet 3.0'da değilseniz, Apache Commons FileUpload'u kullanın

Henüz Servlet 3.0'da değilseniz (yükseltme zamanı gelmedi mi?), Yaygın uygulama, çok parçalı form veri isteklerini ayrıştırmak için Apache Commons FileUpload'u kullanmaktır . Mükemmel bir Kullanım Kılavuzu ve SSS (dikkatle her ikisini de gözden geçirin ) vardır. Ayrıca O'Reilly (" cos ") var MultipartRequest, ancak bazı (küçük) hatalar var ve yıllarca aktif olarak tutulmuyor. Bunu kullanmanızı tavsiye etmem. Apache Commons FileUpload hala aktif olarak bakımını yapıyor ve şu anda çok olgun.

Apache Commons FileUpload'u kullanmak için web uygulamanızda en azından aşağıdaki dosyalara sahip olmanız gerekir /WEB-INF/lib:

Müşterek IO'yu unuttuğunuz için ilk denemeniz büyük olasılıkla başarısız oldu.

İşte nasıl bir başlama örnek doPost(), aramalarınızdan UploadServletApache Commons FileUpload kullanırken gibi görünebilir:

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

    // ...
}

Bu demiyorlar çok önemli getParameter(), getParameterMap(), getParameterValues(), getInputStream(), getReader()önceden aynı istek üzerine vb. Aksi takdirde sunucu uygulaması kapsayıcısı istek gövdesini okuyacak ve ayrıştıracak ve böylece Apache Commons FileUpload boş bir istek gövdesi alacaktır. Ayrıca bkz. Ao ServletFileUpload # parseRequest (istek) boş bir liste döndürür .

Not edin FilenameUtils#getName(). Bu dosya adını almak için bir MSIE düzeltmedir. Bu tarayıcı, yalnızca dosya adı yerine tam dosya yolunu ad boyunca yanlış gönderir.

Alternatif olarak, her şeyi otomatik olarak Filterayrıştıran bir öğeye sarılabilir request.getParameter()ve her zamanki yolu kullanmaya devam edebilmeniz ve karşıya yüklenen dosyayı geri alabilmeniz için öğeleri isteğin parametre haritasına geri koyabilirsiniz request.getAttribute(). Bu blog makalesinde bir örnek bulabilirsiniz .

GlassFish3 getParameter()hala geri dönme hatası için geçici çözümnull

3.1.2'den eski Glassfish sürümlerinde hala geri dönen bir hata bulunduğunu unutmayın . Böyle bir kapsayıcıyı hedefliyorsanız ve yükseltemiyorsanız , bu yardımcı program yöntemiyle değeri ayıklamanız gerekir :getParameter()nullgetPart()

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

Yüklenen dosya kaydetme (kullanmayın getRealPath()ne de part.write()!)

Elde edilen InputStream( fileContentyukarıdaki kod snippet'lerinde gösterildiği gibi değişken) diske veya veritabanına doğru bir şekilde kaydetme hakkında ayrıntılı bilgi için aşağıdaki cevaplara gidin :

Yüklenen dosyayı sunma

Kaydedilen dosyayı diskten veya veritabanından istemciye düzgün bir şekilde sunma konusunda ayrıntılı bilgi için aşağıdaki yanıtlara gidin:

Formu tahsis etme

Ajax (ve jQuery) kullanarak nasıl yükleme yapacağınız konusunda aşağıdaki yanıtlara gidin. Bunun için form verilerini toplamak üzere sunucu uygulaması kodunun değiştirilmesine gerek olmadığını unutmayın! Yalnızca yanıt verme şekliniz değiştirilebilir, ancak bu oldukça önemsizdir (yani, JSP'ye iletmek yerine, Ajax çağrısından sorumlu komut dosyasının beklediğine bağlı olarak bazı JSON veya XML veya düz metin yazdırmanız yeterlidir).


Umarım hepsi yardımcı olur :)


Ah üzgünüm, görüyordum request.getParts("file")ve kafam karıştı
x_x

Servlet 3.0 ile, bir MultipartConfigkoşul ihlal edilirse (örneğin:) maxFileSize, çağrı request.getParameter()null değerini döndürür. Bu bilerek mi? Arama yapmadan getPart(ve kontrol etmeden önce) bazı düzenli (metin) parametreler alırsam ne olur IllegalStateException? NullPointerExceptionBen kontrol etmek için bir şans önce a atılır neden olur IllegalStateException.
16:46

@BalusC Bununla ilgili bir yazı oluşturdum, File API webKitDirectory'den nasıl ekstra bilgi alabileceğim hakkında bir fikriniz var mı? Daha fazla ayrıntı için burayı tıklayın stackoverflow.com/questions/45419598/…
Rapster

Servlet 3.0'da değilseniz ve FileUpload hilesini kullanıyorsanız, dosyayı istekte birden fazla kez okuyamayacağınızı buldum. Bu işlevselliğe ihtiyacınız varsa Spring's MultiPartFilter'a bakmak isteyebilirsiniz. Bu
yazının

1
Evet, eğer birisi tomcat 7 ile 3.0 bölümünde kodu kullanmaya çalışırsa, String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.kısmen bana benzer bir sorunla karşılaşabilir
raviraja

26

Spring MVC kullanıyorsanız, bu nasıl yapılır: (Birisi yararlı bulması durumunda bunu burada bırakıyorum).

enctype" multipart/form-data" Olarak ayarlanmış bir form kullanın (BalusC'nin Cevabı ile aynı)

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

Denetleyicinizdeki olarak, istek parametresini eşleştirmek fileiçin MultipartFileaşağıdaki gibi türü:

@RequestMapping(value = "/upload", method = RequestMethod.POST)
public void handleUpload(@RequestParam("file") MultipartFile file) throws IOException {
    if (!file.isEmpty()) {
            byte[] bytes = file.getBytes(); // alternatively, file.getInputStream();
            // application logic
    }
}

MultipartFile'S getOriginalFilename()ve ' kullanarak dosya adını ve boyutunu alabilirsiniz getSize().

Bunu Spring versiyonu ile test ettim 4.1.1.RELEASE.


Eğer yanılmıyorsam, bu sunucunun uygulama yapılandırmasında bir fasulye yapılandırmak gerektirir ...
Kenny Worden

11

İhtiyacınız common-io.1.4.jarsenin eklenecek dosyayı libdizin veya herhangi bir editör çalışıyorsanız, NetBeans gibi, o zaman proje özelliklerine gidip sadece JAR dosyası eklemek gerekiyor ve yapılacaktır.

Dosyayı almak için common.io.jarsadece google veya sadece bu dosyayı ücretsiz indirme seçeneği olan Apache Tomcat web sitesine gidin . Ancak bir şeyi unutmayın: Windows kullanıcısıysanız ikili ZIP dosyasını indirin.


Bulamıyorum .jarama .zip. Bunu mu demek istediniz .zip?
Malwinder Singh

10

Tomcat 6 o 7'de bileşen veya harici Kütüphane olmadan

Web.xml dosyasında Yüklemeyi etkinleştirme :

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

Görebileceğiniz gibi :

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

JSP Kullanarak Dosya Yükleme. Dosyalar:

Html dosyasında

<form method="post" enctype="multipart/form-data" name="Form" >

  <input type="file" name="fFoto" id="fFoto" value="" /></td>
  <input type="file" name="fResumen" id="fResumen" value=""/>

JSP Dosyasında veya Servlet'te

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

Kodunuzu, maksimum dosya boyutu , maksimum istek boyutu ve ayarlayabileceğiniz diğer seçenekler gibi sunucu uygulaması gereksinimlerine göre düzenleyin ...


9

Ekleri olsun ya da olmasın her Html Formu için ortak Servlet kullanıyorum . Bu Servlet TreeMap, anahtarların jsp adı olduğu bir yeri döndürür Parametreler ve değerler Kullanıcı Girişleri'dir ve tüm ekleri sabit dizine kaydeder ve daha sonra istediğiniz dizini yeniden adlandırırsınız. Bence bu sana yardımcı olacak

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 hey canlı sunucu kullanarak im dosyayolu ne olmalıdır veya ben sunucuya dosya yükleyerek benim proje canlı
AmanS

2
Canlı sunucudaki herhangi bir dizin. Sunucu uygulamasında bir dizin oluşturmak için bir kod yazarsanız, dizin canlı srver'de oluşturulur
iyi hissedin ve programlama

8

Spring MVC için bunu saatlerce çalışıyorum ve hem veri hem de görüntü form girişi almak için çalışan daha basit bir sürümü var başardı.

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

Kontrol edilecek kumanda

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

Umarım yardımcı olur :)


Seçtiğiniz resim formunu db mysql ile paylaşabilir ve jsp / html'de gösterebilir misiniz?
Ved Prakash

6

Gömülü Tomcat ile Geronimo kullanıyorsanız, bu sorunun başka bir kaynağı oluşur. Bu durumda, commons-io ve commons-fileupload testlerinin birçok yinelemesinden sonra, sorun commons-xxx kavanozlarını işleyen bir üst sınıf yükleyiciden kaynaklanır. Bu önlenmelidir. Çökme her zaman şu yerde meydana geldi:

fileItems = uploader.parseRequest(request);

FileItems öğesinin Liste türünün List<FileItem>, genel olan önceki sürümlerin aksine , commons-fileupload öğesinin geçerli sürümüyle değiştirildiğini unutmayın List.

Gerçek hatayı izlemek için commlip-fileupload ve commons-io kaynak kodunu Eclipse projeme ekledim ve sonunda biraz fikir edindim. İlk olarak, atılan istisna, belirtilen FileIOException ve hatta Exception (Throwable) türünde değildir (bunlar tuzağa düşürülmez). İkincisi, eksen mesajı commons-io bulamadığı için hata mesajı sınıf bulunamadığından gizlidir. Axis2 projemde hiç kullanılmıyor ancak standart kurulumun bir parçası olarak Geronimo veri havuzu alt dizininde bir klasör olarak var.

Sonunda, sorunumu başarıyla çözen çalışan bir çözüm sunan 1 yer buldum. Dağıtım planındaki kavanozları ana yükleyiciden gizlemelisiniz. Bu, tam dosyamı aşağıda gösterilen şekilde geronimo-web.xml dosyasına konuldu.

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

Apache commons-fileupload kullanan bir örnek:

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

Bir milyar kitaplık olmadan dosyalar ve giriş kontrolleri için en basit yol ortaya çıkabilir:

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

jsp / servlet kullanarak dosya yükleyebilirsiniz.

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

diğer yandan sunucu tarafında. aşağıdaki kodu kullanın.

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

Bu nesneden dosya öğelerini ve alanlarını almanız gerekir, daha sonra aşağıdaki gibi sunucuya depolayabilirsiniz:

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

-2

Dosya için birden fazla dosya enctype="multipart/form-data"
gönderme multiple="multiple"ve giriş etiketinde birden fazla dosya kullanımı göndermemiz gerekiyor

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

2
Nasıl bir Parçalar dizisi elde edelim? Birden fazla dosya için getPart'ın işe yarayacağını sanmıyorum?
CyberMew

-2

HTML SAYFASI

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

SERVLET DOSYASI

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

Yukarıdaki sunucu uygulaması UploadServlet'i derleyin ve web.xml dosyasında aşağıdaki gibi gerekli girişi oluşturun.

<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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.