JSP /サーブレットを使用してサーバーにファイルをアップロードする方法


688

JSP /サーブレットを使用してファイルをサーバーにアップロードするにはどうすればよいですか?私はこれを試しました:

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

ただし、ファイル名のみを取得し、ファイルの内容は取得しません。に追加 enctype="multipart/form-data"すると<form>request.getParameter()が返されますnull

調査中、Apache Common FileUploadを偶然見つけました。私はこれを試しました:

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

残念ながら、サーブレットは明確なメッセージと原因なしに例外をスローしました。これがスタックトレースです:

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)

おそらくこの記事が役立つでしょう:baeldung.com/upload-file-servlet
Adam Gerard

回答:


1193

前書き

アップロードするファイルを参照して選択するに<input type="file">は、フォームにHTML フィールドが必要です。HTML仕様に記載されているように、POSTメソッドを使用する必要がenctypeあり、フォームの属性をに設定する必要があり"multipart/form-data"ます。

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

そのようなフォームを送信した後、バイナリマルチパートフォームデータは、が設定されていない場合とは異なる形式でリクエスト本文で使用できますenctype

サーブレット3.0以前は、サーブレットAPIはをネイティブにサポートしていませんでしたmultipart/form-data。デフォルトのフォームenctypeのみをサポートしていますapplication/x-www-form-urlencodedrequest.getParameter()そしてCONSORTSすべての復帰を希望nullマルチパートフォームデータを使用した場合。これは、よく知られているApache Commons FileUploadが登場した場所です。

手動で解析しないでください!

理論的には、に基づいてリクエスト本文を自分で解析できますServletRequest#getInputStream()。ただし、これはRFC2388の正確な知識を必要とする正確で退屈な作業です。自分でこれを実行したり、インターネット上の他の場所で見つかった独自のライブラリなしのコードをコピー貼り付けしたりしないでください。roseindia.netなど、多くのオンラインソースがこれに失敗しました。PDFファイルのアップロードもご覧ください。何百万人ものユーザーによって何年も使用されている(そして暗黙的にテストされている)実際のライブラリを使用するべきです。このようなライブラリは、その堅牢性を証明しています。

サーブレット3.0以降を使用している場合は、ネイティブAPIを使用します

少なくともサーブレット3.0(Tomcat 7、Jetty 9、JBoss AS 6、GlassFish 3など)を使用している場合は、提供さHttpServletRequest#getPart()れている標準APIを使用して、個々のマルチパートフォームデータ項目を収集できます(ほとんどのServlet 3.0実装は実際にApacheを使用します) Commons FileUploadはこのカバーの下にあります!)。また、通常のフォームフィールドはgetParameter()通常の方法で使用できます。

最初にサーブレットに注釈を付けて、リクエストを@MultipartConfig認識してサポートmultipart/form-dataし、getPart()作業を開始できるようにします。

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

次に、doPost()次のように実装します。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String description = request.getParameter("description"); // Retrieves <input type="text" name="description">
    Part filePart = request.getPart("file"); // Retrieves <input type="file" name="file">
    String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.
    InputStream fileContent = filePart.getInputStream();
    // ... (do your job here)
}

に注意してくださいPath#getFileName()。これは、ファイル名の取得に関するMSIEの修正です。このブラウザは、ファイル名だけではなく、名前に沿って完全なファイルパスを誤って送信します。

<input type="file" name="file" multiple="true" />マルチファイルのアップロードがある場合は、以下のように収集してください(残念ながらのような方法はありませんrequest.getParts("file"))。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // ...
    List<Part> fileParts = request.getParts().stream().filter(part -> "file".equals(part.getName()) && 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)
    }
}

まだサーブレット3.1を使用していない場合は、送信されたファイル名を手動で取得します

Part#getSubmittedFileName()サーブレット3.1(Tomcat 8、Jetty 9、WildFly 8、GlassFish 4など)で導入されたことに注意してください。まだサーブレット3.1を使用していない場合は、送信されたファイル名を取得するための追加のユーティリティメソッドが必要です。

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

ファイル名の取得については、MSIEの修正に注意してください。このブラウザは、ファイル名だけではなく、名前に沿って完全なファイルパスを誤って送信します。

まだサーブレット3.0を使用していない場合は、Apache Commons FileUploadを使用します

まだServlet 3.0を使用していない場合(アップグレードの時期ではありませんか?)、一般的な方法は、Apache Commons FileUploadを使用してマルチパートフォームデータリクエストを解析することです。優れたユーザーガイドFAQがあります(両方を注意深く読んでください)。O'Reilly( " cos ")もありますがMultipartRequest、いくつかの(マイナー)バグがあり、何年も積極的にメンテナンスされていません。私はそれを使用することをお勧めしません。Apache Commons FileUploadはまだ積極的に維持されており、現在非常に成熟しています。

Apache Commons FileUploadを使用するには、Webアプリケーションに少なくとも以下のファイルが必要です/WEB-INF/lib

コモンズIOを忘れたため、最初の試行が失敗した可能性があります。

Apache Commons FileUploadを使用した場合のキックオフの例を次に示しdoPost()ますUploadServlet

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
        for (FileItem item : items) {
            if (item.isFormField()) {
                // Process regular form field (input type="text|radio|checkbox|etc", select, etc).
                String fieldName = item.getFieldName();
                String fieldValue = item.getString();
                // ... (do your job here)
            } else {
                // Process form file field (input type="file").
                String fieldName = item.getFieldName();
                String fileName = FilenameUtils.getName(item.getName());
                InputStream fileContent = item.getInputStream();
                // ... (do your job here)
            }
        }
    } catch (FileUploadException e) {
        throw new ServletException("Cannot parse multipart request.", e);
    }

    // ...
}

それはあなたが呼び出すことはありませんということが非常に重要ですgetParameter()getParameterMap()getParameterValues()getInputStream()getReader()事前に同じリクエストに応じてなど、。それ以外の場合、サーブレットコンテナはリクエストボディを読み取って解析し、Apache Commons FileUploadは空のリクエストボディを取得します。ao ServletFileUpload#parseRequest(request)が空のリストを返すも参照してください。

に注意してくださいFilenameUtils#getName()。これは、ファイル名の取得に関するMSIEの修正です。このブラウザは、ファイル名だけではなく、名前に沿って完全なファイルパスを誤って送信します。

またはFilter、すべてを自動的に解析するでこれをすべてラップし、リクエストのパラメーターマップにデータを戻すことでrequest.getParameter()、通常の方法を使用してアップロードしたファイルをで取得できるようにすることもできますrequest.getAttribute()このブログ記事で例を見つけることができます

GlassFish3バグがgetParameter()まだ戻るという回避策null

3.1.2より前のバージョンのGlassfishにはバグgetParameter()まだあるということに注意してくださいnull。このようなコンテナを対象としていて、アップグレードできない場合getPart()は、このユーティリティメソッドを使用して値を抽出する必要があります。

private static String getValue(Part part) throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(part.getInputStream(), "UTF-8"));
    StringBuilder value = new StringBuilder();
    char[] buffer = new char[1024];
    for (int length = 0; (length = reader.read(buffer)) > 0;) {
        value.append(buffer, 0, length);
    }
    return value.toString();
}
String description = getValue(request.getPart("description")); // Retrieves <input type="text" name="description">

アップロードしたファイルを保存しています(使用しgetRealPath()ないでpart.write()ください!)

適切に得られる節約上の詳細は、次の回答にヘッドInputStreamfileContentディスクまたはデータベースに上記のコードスニペットに示すように、変数):

アップロードされたファイルを提供する

保存されたファイルをディスクまたはデータベースからクライアントに適切に提供する方法の詳細については、次の回答を参照してください。

フォームをAjax化する

Ajax(およびjQuery)を使用してアップロードする方法については、次の回答を参照してください。フォームデータを収集するためのサーブレットコードを変更する必要はありません。応答方法のみが変更される可能性がありますが、これはかなり自明です(つまり、JSPに転送する代わりに、Ajax呼び出しを担当するスクリプトが期待するものに応じて、JSONまたはXMLまたはプレーンテキストを印刷するだけです)。


これがすべて役に立てば幸い:)


申し訳ありませんが、request.getParts("file")x_xを見て混乱していました
Kagami Sascha Rosylight 2016年

サーブレット3.0では、MultipartConfig条件に違反している場合(例:)maxFileSize、呼び出しrequest.getParameter()はnull を返します。これは意図的ですか?呼び出す前にgetPart(およびを確認する前に)通常の(テキスト)パラメータを取得した場合はどうなりIllegalStateExceptionますか?これにより、NullPointerExceptionを確認する前にがスローされますIllegalStateException
theyuv

@BalusCこれに関連する投稿を作成しました。FileAPI webKitDirectoryから追加情報を取得する方法を知っていますか。詳細はこちらをstackoverflow.com/questions/45419598/...
Rapster

サーブレット3.0を使用しておらず、FileUploadトリックを使用している場合、リクエストからファイルを2回以上読み取ることができないことがわかりました。この機能が必要な場合は、SpringのMultiPartFilterをご覧ください。この投稿には良い動作例があります:stackoverflow.com/a/21448087/1048376
splashout 2017年

1
ええ、誰かが3.0セクションのコードをTomcat 7で使用しようとすると、String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.一部は私と同じような問題に直面する可能性があります
raviraja

26

Spring MVCをたまたま使用する場合の方法は次のとおりです(誰かが便利だと思った場合に備えて、ここに残しておきます)。

enctype属性を " multipart/form-data"に設定したフォームを使用します(BalusCの回答と同じ)

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

コントローラで、リクエストパラメータfileMultipartFile次のようにタイプにマッピングします。

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

あなたは使用してファイル名とサイズを取得することができMultipartFileさんgetOriginalFilename()getSize()

私はこれをSpringバージョンでテストしました4.1.1.RELEASE


私が間違っていなければ、サーバーのアプリケーション構成でBeanを構成する必要があります...
Kenny Worden

11

ディレクトリにcommon-io.1.4.jarファイルを含める必要がありますlib。NetBeansなどのエディタで作業している場合は、プロジェクトのプロパティに移動してJARファイルを追加するだけで完了です。

common.io.jarファイルを取得するには、Googleでファイルをダウンロードするか、Apache Tomcat Webサイトにアクセスして、このファイルを無料でダウンロードするためのオプションを取得します。ただし、Windowsユーザーの場合はバイナリZIPファイルをダウンロードしてください。


見つかりません.jar.zip。もしかして.zip
Malwinder Singh 2014

10

Tomcat 6 o 7のコンポーネントまたは外部ライブラリなし

web.xmlファイルでアップロードを有効にする:

http://joseluisbz.wordpress.com/2014/01/17/manually-installing-php-tomcat-and-httpd-lounge/#Enabling%20File%20Uploads

<servlet>
    <servlet-name>jsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    <multipart-config>
      <max-file-size>3145728</max-file-size>
      <max-request-size>5242880</max-request-size>
    </multipart-config>
    <init-param>
        <param-name>fork</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>xpoweredBy</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>3</load-on-startup>
</servlet>

あなたが見ることができるように

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

JSPを使用したファイルのアップロード。ファイル:

htmlファイル

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

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

JSPファイルまたはサーブレット

    InputStream isFoto = request.getPart("fFoto").getInputStream();
    InputStream isResu = request.getPart("fResumen").getInputStream();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte buf[] = new byte[8192];
    int qt = 0;
    while ((qt = isResu.read(buf)) != -1) {
      baos.write(buf, 0, qt);
    }
    String sResumen = baos.toString();

max-file-sizemax-request-size などのサーブレット要件に合わせてコードを編集し、設定できるその他のオプションを...


9

添付ファイルがあるかどうかにかかわらず、すべての HTMLフォームに共通のサーブレットを使用しています。このサーブレットはTreeMap、キーがjsp名であるパラメーターを返し、パラメーターと値はユーザー入力であり、すべての添付ファイルを固定ディレクトリに保存し、後で選択したディレクトリの名前を変更します。ここで、Connectionsは、接続オブジェクトを持つカスタムインターフェイスです。これはあなたに役立つと思います

public class ServletCommonfunctions extends HttpServlet implements
        Connections {

    private static final long serialVersionUID = 1L;

    public ServletCommonfunctions() {}

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

    public SortedMap<String, String> savefilesindirectory(
            HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        // Map<String, String> key_values = Collections.synchronizedMap( new
        // TreeMap<String, String>());
        SortedMap<String, String> key_values = new TreeMap<String, String>();
        String dist = null, fact = null;
        PrintWriter out = response.getWriter();
        File file;
        String filePath = "E:\\FSPATH1\\2KL06CS048\\";
        System.out.println("Directory Created   ????????????"
            + new File(filePath).mkdir());
        int maxFileSize = 5000 * 1024;
        int maxMemSize = 5000 * 1024;
        // Verify the content type
        String contentType = request.getContentType();
        if ((contentType.indexOf("multipart/form-data") >= 0)) {
            DiskFileItemFactory factory = new DiskFileItemFactory();
            // maximum size that will be stored in memory
            factory.setSizeThreshold(maxMemSize);
            // Location to save data that is larger than maxMemSize.
            factory.setRepository(new File(filePath));
            // Create a new file upload handler
            ServletFileUpload upload = new ServletFileUpload(factory);
            // maximum file size to be uploaded.
            upload.setSizeMax(maxFileSize);
            try {
                // Parse the request to get file items.
                @SuppressWarnings("unchecked")
                List<FileItem> fileItems = upload.parseRequest(request);
                // Process the uploaded file items
                Iterator<FileItem> i = fileItems.iterator();
                while (i.hasNext()) {
                    FileItem fi = (FileItem) i.next();
                    if (!fi.isFormField()) {
                        // Get the uploaded file parameters
                        String fileName = fi.getName();
                        // Write the file
                        if (fileName.lastIndexOf("\\") >= 0) {
                            file = new File(filePath
                                + fileName.substring(fileName
                                        .lastIndexOf("\\")));
                        } else {
                            file = new File(filePath
                                + fileName.substring(fileName
                                        .lastIndexOf("\\") + 1));
                        }
                        fi.write(file);
                    } else {
                        key_values.put(fi.getFieldName(), fi.getString());
                    }
                }
            } catch (Exception ex) {
                System.out.println(ex);
            }
        }
        return key_values;
    }
}

@buhake sindiこんにちは、ライブサーバーを使用している場合、またはサーバーにファイルをアップロードしてプロジェクトをライブしている場合のファイルパスは何ですか
AmanS

2
ライブサーバー内の任意のディレクトリ。サーブレット内にディレクトリを作成するコードを記述した場合、ディレクトリはライブサーバーに作成されます
でプログラミング

8

Spring MVCの場合、 私は何時間もこれを行うために努力しており、データと画像の両方のフォーム入力を取得するために機能する単純なバージョンをなんとか持っています。

<form action="/handleform" method="post" enctype="multipart/form-data">
  <input type="text" name="name" />
  <input type="text" name="age" />
  <input type="file" name="file" />
  <input type="submit" />
</form>

処理するコントローラー

@Controller
public class FormController {
    @RequestMapping(value="/handleform",method= RequestMethod.POST)
    ModelAndView register(@RequestParam String name, @RequestParam int age, @RequestParam MultipartFile file)
            throws ServletException, IOException {

        System.out.println(name);
        System.out.println(age);
        if(!file.isEmpty()){
            byte[] bytes = file.getBytes();
            String filename = file.getOriginalFilename();
            BufferedOutputStream stream =new BufferedOutputStream(new FileOutputStream(new File("D:/" + filename)));
            stream.write(bytes);
            stream.flush();
            stream.close();
        }
        return new ModelAndView("index");
    }
}

それが役に立てば幸い :)


db mysqlから選択した画像を共有して、jsp / htmlに表示できますか?
Ved Prakash

6

この問題の別の原因は、組み込みのTomcatでGeronimoを使用している場合です。この場合、commons-ioおよびcommons-fileuploadのテストを何度も繰り返した後、commons-xxx jarを処理する親クラスローダーから問題が発生します。これを防ぐ必要があります。クラッシュは常に次の場所で発生しました:

fileItems = uploader.parseRequest(request);

fileItemsのListタイプは、現在のcommons-fileuploadのバージョンで変更され、List<FileItem>以前のバージョンが汎用だったのとは明確に異なりListます。

commons-fileuploadおよびcommons-ioのソースコードをEclipseプロジェクトに追加して実際のエラーを追跡し、最終的にいくつかの洞察を得ました。まず、スローされる例外のタイプはThrowableであり、指定されたFileIOExceptionもExceptionもありません(これらはトラップされません)。第2に、axis2がcommons-ioを見つけられなかったためにクラスが見つからなかったというエラーメッセージは難読化されています。Axis2は私のプロジェクトではまったく使用されていませんが、標準インストールの一部としてGeronimoリポジトリーサブディレクトリー内のフォルダーとして存在しています。

最後に、問題を正常に解決する実用的なソリューションを提案した場所が1つ見つかりました。デプロイメントプランでは、jarを親ローダーから非表示にする必要があります。これは、以下に示す私の完全なファイルとともにgeronimo-web.xmlに入れられました。

Pasted from <http://osdir.com/ml/user-geronimo-apache/2011-03/msg00026.html> 



<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<web:web-app xmlns:app="http://geronimo.apache.org/xml/ns/j2ee/application-2.0" xmlns:client="http://geronimo.apache.org/xml/ns/j2ee/application-client-2.0" xmlns:conn="http://geronimo.apache.org/xml/ns/j2ee/connector-1.2" xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.2" xmlns:ejb="http://openejb.apache.org/xml/ns/openejb-jar-2.2" xmlns:log="http://geronimo.apache.org/xml/ns/loginconfig-2.0" xmlns:name="http://geronimo.apache.org/xml/ns/naming-1.2" xmlns:pers="http://java.sun.com/xml/ns/persistence" xmlns:pkgen="http://openejb.apache.org/xml/ns/pkgen-2.1" xmlns:sec="http://geronimo.apache.org/xml/ns/security-2.0" xmlns:web="http://geronimo.apache.org/xml/ns/j2ee/web-2.0.1">
    <dep:environment>
        <dep:moduleId>
            <dep:groupId>DataStar</dep:groupId>
            <dep:artifactId>DataStar</dep:artifactId>
            <dep:version>1.0</dep:version>
            <dep:type>car</dep:type>
        </dep:moduleId>

<!--Don't load commons-io or fileupload from parent classloaders-->
        <dep:hidden-classes>
            <dep:filter>org.apache.commons.io</dep:filter>
            <dep:filter>org.apache.commons.fileupload</dep:filter>
        </dep:hidden-classes>
        <dep:inverse-classloading/>        


    </dep:environment>
    <web:context-root>/DataStar</web:context-root>
</web:web-app>

0

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

最も単純な方法は、10億のライブラリなしでファイルと入力コントロールを考え出すことができます。

  <%
  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を使用してファイルをアップロードできます。

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

一方、サーバー側。次のコードを使用します。

     package com.abc..servlet;

import java.io.File;
---------
--------


/**
 * Servlet implementation class UploadFileServlet
 */
public class UploadFileServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public UploadFileServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.sendRedirect("../jsp/ErrorPage.jsp");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub

            PrintWriter out = response.getWriter();
            HttpSession httpSession = request.getSession();
            String filePathUpload = (String) httpSession.getAttribute("path")!=null ? httpSession.getAttribute("path").toString() : "" ;

            String path1 =  filePathUpload;
            String filename = null;
            File path = null;
            FileItem item=null;


            boolean isMultipart = ServletFileUpload.isMultipartContent(request);

            if (isMultipart) {
                FileItemFactory factory = new DiskFileItemFactory();
                ServletFileUpload upload = new ServletFileUpload(factory);
                String FieldName = "";
                try {
                    List items = upload.parseRequest(request);
                    Iterator iterator = items.iterator();
                    while (iterator.hasNext()) {
                         item = (FileItem) iterator.next();

                            if (fieldname.equals("description")) {
                                description = item.getString();
                            }
                        }
                        if (!item.isFormField()) {
                            filename = item.getName();
                            path = new File(path1 + File.separator);
                            if (!path.exists()) {
                                boolean status = path.mkdirs();
                            }
                            /* START OF CODE FRO PRIVILEDGE*/

                            File uploadedFile = new File(path + Filename);  // for copy file
                            item.write(uploadedFile);
                            }
                        } else {
                            f1 = item.getName();
                        }

                    } // END OF WHILE 
                    response.sendRedirect("welcome.jsp");
                } catch (FileUploadException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                } 
            }   
    }

}

-1
DiskFileUpload upload=new DiskFileUpload();

このオブジェクトからファイルアイテムとフィールドを取得する必要があります。次のようにサーバーに保存できます。

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

-2

使用enctype="multipart/form-data"
しなければならないファイルおよび複数のファイルmultiple="multiple"を入力タグで 使用するために複数のファイルを送信する

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

2
代わりにgetPart( "fileattachments")を実行して、Partの配列を取得するにはどうすればよいでしょうか。複数のファイルのgetPartが機能しないと思いますか?
Cyber​​Mew、2015

-2

HTMLページ

<html>
<head>
<title>File Uploading Form</title>
</head>
<body>
<h3>File Upload:</h3>
Select a file to upload: <br />
<form action="UploadServlet" method="post"
                        enctype="multipart/form-data">
<input type="file" name="file" size="50" />
<br />
<input type="submit" value="Upload File" />
</form>
</body>
</html> 

サーベットファイル

// Import required java libraries
import java.io.*;
import java.util.*;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.output.*;

public class UploadServlet extends HttpServlet {

   private boolean isMultipart;
   private String filePath;
   private int maxFileSize = 50 * 1024;
   private int maxMemSize = 4 * 1024;
   private File file ;

   public void init( ){
      // Get the file location where it would be stored.
      filePath = 
             getServletContext().getInitParameter("file-upload"); 
   }
   public void doPost(HttpServletRequest request, 
               HttpServletResponse response)
              throws ServletException, java.io.IOException {
      // Check that we have a file upload request
      isMultipart = ServletFileUpload.isMultipartContent(request);
      response.setContentType("text/html");
      java.io.PrintWriter out = response.getWriter( );
      if( !isMultipart ){
         out.println("<html>");
         out.println("<head>");
         out.println("<title>Servlet upload</title>");  
         out.println("</head>");
         out.println("<body>");
         out.println("<p>No file uploaded</p>"); 
         out.println("</body>");
         out.println("</html>");
         return;
      }
      DiskFileItemFactory factory = new DiskFileItemFactory();
      // maximum size that will be stored in memory
      factory.setSizeThreshold(maxMemSize);
      // Location to save data that is larger than maxMemSize.
      factory.setRepository(new File("c:\\temp"));

      // Create a new file upload handler
      ServletFileUpload upload = new ServletFileUpload(factory);
      // maximum file size to be uploaded.
      upload.setSizeMax( maxFileSize );

      try{ 
      // Parse the request to get file items.
      List fileItems = upload.parseRequest(request);

      // Process the uploaded file items
      Iterator i = fileItems.iterator();

      out.println("<html>");
      out.println("<head>");
      out.println("<title>Servlet upload</title>");  
      out.println("</head>");
      out.println("<body>");
      while ( i.hasNext () ) 
      {
         FileItem fi = (FileItem)i.next();
         if ( !fi.isFormField () )  
         {
            // Get the uploaded file parameters
            String fieldName = fi.getFieldName();
            String fileName = fi.getName();
            String contentType = fi.getContentType();
            boolean isInMemory = fi.isInMemory();
            long sizeInBytes = fi.getSize();
            // Write the file
            if( fileName.lastIndexOf("\\") >= 0 ){
               file = new File( filePath + 
               fileName.substring( fileName.lastIndexOf("\\"))) ;
            }else{
               file = new File( filePath + 
               fileName.substring(fileName.lastIndexOf("\\")+1)) ;
            }
            fi.write( file ) ;
            out.println("Uploaded Filename: " + fileName + "<br>");
         }
      }
      out.println("</body>");
      out.println("</html>");
   }catch(Exception ex) {
       System.out.println(ex);
   }
   }
   public void doGet(HttpServletRequest request, 
                       HttpServletResponse response)
        throws ServletException, java.io.IOException {

        throw new ServletException("GET method used with " +
                getClass( ).getName( )+": POST method required.");
   } 
}

web.xml

上記のサーブレットUploadServletをコンパイルし、次のようにweb.xmlファイルに必要なエントリを作成します。

<servlet>
   <servlet-name>UploadServlet</servlet-name>
   <servlet-class>UploadServlet</servlet-class>
</servlet>

<servlet-mapping>
   <servlet-name>UploadServlet</servlet-name>
   <url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.