1

「org.apache.tomcat.util.fileupload」を使用してファイルのアップロードに Apache Tomcat 7.0.34 を使用すると、エラーは表示されず、すべて正常に動作します。しかし、Apache Tomcat 7.0.40 を使用すると、「parseRequest(request)」行で 1 つのエラーが発生しました。RequestContext を使用するとエラーが発生するため、これをエラーとして伝えることはできませんが、RequestContext インターフェイスの使用方法がわかりません。インスタンスを "parseRequest(RequestContext ctx)" メソッドに渡す必要があるため、RequestContext の使用方法を教えてください。

 public void service(HttpServletRequest request,HttpServletResponse response)
{
    response.setContentType("text/html;charset=UTF-8");         

    String status=null;
    List<FileItem> items=null;

    try
    {      
        if(ServletFileUpload.isMultipartContent(request))
        {             
            items=new ServletFileUpload(new    
    DiskFileItemFactory()).parseRequest(request);
            for(FileItem item:items)
            {                   
                if(item.getFieldName().equals("status"))
                    status=item.getString();
            }  
        }
   }
    catch(Exception e)
    {
       e.printStackTrace();
    }
}   

parseRequest(RequestContext ctx) 内に RequestContext インスタンスを配置する必要がありますが、RequestContext の使用方法がわかりません。

4

1 に答える 1

4

これは、Servlet 3.0 でファイルのアップロードを処理する正しい方法ではありません。代わり@MultipartConfigに、サーブレットでアノテーションを使用し、HttpServletRequest#getPart()メソッドを使用してアップロードされたファイルを取得する必要があります。これは、サーブレット 3.0 で導入されました。

このorg.apache.tomcat.util.fileuploadパッケージには、この新しい Servlet 3.0 機能のすべての「舞台裏」作業を行っているクラスが正確に含まれています。sun.*Sun/Oracle JVM で Java SE を使用する場合はクラスを使用しないようcom.mysql.*に、MySQL DB で JDBC を使用する場合はクラスを使用しないように、それらを直接使用しないでください。たまたま同じクラス名を使用しているApache Commons FileUploadを使用して Servlet 2.5 以前を対象とした例に混乱したようです。

Tomcat 固有のクラスを使用すると、Web アプリが特定の Tomcat バージョンに密結合され、Webアプリが他の Servlet 3.0 互換コンテナーや、別の Tomcat バージョンに移植できなくなります。この特定のケースでは、javax.servletパッケージの標準クラスに固執する必要があります。

正しい方法は、この回答の 2 番目の部分に示されています: How to upload files to server using JSP/Servlet?

全体として、このキックオフの例で始める必要があります。

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

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

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String status = request.getParameter("status"); // Retrieves <input type="text" name="status">
        Part uploadedFile = request.getPart("uploadedFile"); // Retrieves <input type="file" name="uploadedFile">
        InputStream content = uploadedFile.getInputStream();
        // ... (do your job here)
    }

}

それで全部です。

于 2013-07-12T12:38:58.080 に答える