1

私は Apache Commons FileUpload でこれをやってみました:

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException {

    PrintWriter out = null;

    try {

        response.setContentType("text/html;charset=UTF-8");
        //MultipartFormDataRequest dataRequest = new MultipartFormDataRequest(request);
        //get uploaded files
        FileItemFactory factory = new DiskFileItemFactory();
        // Create a new file upload handler
        ServletFileUpload upload = new ServletFileUpload(factory);
        List files = null;
        try {
            files = upload.parseRequest(request);
        } catch (FileUploadException ex) {
            Logger.getLogger(ProcessUploadItem.class.getName()).log(Level.SEVERE, null, ex);
    }
}

そしてそれはで失敗しましたfiles = upload.parseRequest(request);

ポインタはありますか?

申し訳ありませんが、ありがとうございます:)

申し訳ありませんが、これらを含めていませんでした:

The log message is null.
java.lang.NullPointerException
    at web.ProcessUploadItem.processRequest(ProcessUploadItem.java:156)
    at web.ProcessUploadItem.doPost(ProcessUploadItem.java:193)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:738)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
    at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:411)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:290)
    at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:271)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:202)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:206)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:150)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080)
    at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:272)
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:637)
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:568)
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:813)
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341)
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263)
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214)
    at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265)
    at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)
java.lang.NullPointerException
    at web.ProcessUploadItem.processRequest(ProcessUploadItem.java:156)
    at web.ProcessUploadItem.doPost(ProcessUploadItem.java:193)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:738)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
    at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:411)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:290)
    at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:271)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:202)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:206)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:150)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080)
    at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:272)
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:637)
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:568)
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:813)
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341)
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263)
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214)
    at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265)
    at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)

グラスフィッシュを使っています

ありがとうございました

4

10 に答える 10

2

スタックトレースから、クラスの156行目で逆参照する項目の1つがnullであることが明らかです。提供されたスニペットには行番号がありませんが、これは実際にはそのupload.parseRequest行でのみ可能であるように見えます(これはあなた自身も失敗した部分として識別しています)。

不思議なことに、これはnullの場合にのみ発生するように見えuploadますが、コンストラクターからnull以外の値が割り当てられ、それ以降変更されているため、指定したコードからは不可能に思えます。

デバッガーをアタッチできる場合は、メソッドをステップ実行してオブジェクト値を検査することをお勧めします。それ以外の場合は、そのポイントの直前にいくつかのprintlnステートメントを入れて、どのオブジェクトがnullで、どのオブジェクトがnullでないかを確認する価値があるかもしれません。

于 2009-06-17T10:37:49.523 に答える
1

uploadその時点でそれは何らかの形でnullであると推測します。提供したソースとコンパイルされたクラス ファイルが同じバージョンであることは確かですか (たとえば、エラー行が別の命令を指しているなど)?

IDE を使用してアプリケーションをデバッグし、NullPointerException のブレークポイントを作成できると思います。

更新: 内側の catch ブロックの後にあるものを教えてください。あなたは何をしますlistか?ファイルがアップロードされていない場合、リストがnullのままになる可能性があることを忘れていたと思いますが、それを繰り返し始めましたか?

于 2009-06-17T10:19:39.747 に答える
0

のドキュメントを読んでいるDiskFileItemFactoryと、ファイルがアップロードされると、ファイルがシステムのどこかに一時的に保存され、そのデフォルト ディレクトリが によって返される一時ディレクトリであることに気付きましたSystem.getProperty("java.io.tmpdir")。このディレクトリへの書き込み権限を持っていますか?そうでない場合は、を呼び出して新しいリポジトリ/ディレクトリを設定できますfactory.setRepository(java.io.File yourDir)

これが役立つかどうかはわかりませんが、単なる提案です。

于 2009-06-17T21:31:20.107 に答える
0

質問が不完全です。

commons-upload のどのバージョンを使用していますか? あなたのフォームはエンコーディング タイプとしてmultipart/form-data MIME タイプを使用していますか?

ここに例があります:

<form action="/uploadServlet" enctype="multipart/form-data" method="post">
  <input type="file" name="file" size="40">
  <input type="submit" value="Send">
</form>
于 2009-06-17T10:18:51.403 に答える
0

フォーム送信はどのように見えますか? 上記のコードは見栄えがよく、私が持っているものを反映しています。

フォーム送信が「マルチパート」タイプであることを確認します。

boolean isMultipart = ServletFileUpload.isMultipartContent(request);

クライアント側では、フォーム エンコーディングをマルチパートに設定する必要があります。RFC1867を参照してください。

parseRequest()また、リクエスト データが呼び出される前に何らかの方法で処理/読み取られた場合は null が返されることに注意してparseRequest()ください (Apache Commons File Upload FAQ を参照してください)。

于 2009-06-05T13:02:51.323 に答える
0

アップロードが processRequest 行で null であるか、行のカウントが間違っています。メソッド全体を投稿していないため、推測に過ぎません。

processRequest 呼び出しが実際にアップロードのインスタンス化に近い場合、何らかの後処理があると思います。編集しているコードは、コンパイルしているコードではない可能性があります。

于 2009-06-23T12:29:24.787 に答える
-1

「and it failed at files = upload.parseRequest(request)」と言うときは、さらに情報を指定する必要があります。とにかくあなたの質問に答えようと思います。

javadoc を見ると、初期化されていない DiskFileItemFactory オブジェクトを作成しています。ファイルを保存するディレクトリを指定する必要があります。setRepository() を呼び出すか、DiskFileItemFactory(int, File) を呼び出してファクトリを作成します。

于 2009-06-05T12:41:18.917 に答える