0

これはうまくいきません。問題は、私が何が起こるべきかを知るのに十分な知識を持っていないことです。このコードをデバッグできません。アップロードを一時フォルダー「temp」に保存してから、「アプレット」に移動したいと思います。助けてください?サーブレットは明らかにアクセスされていますが、アップロードされたファイルが見つかりません...よろしくお願いします。

フォーム (スクリプトレットを使用して作成されます。問題が発生する可能性がある場合は、ここに配置します):

<%
out.write("<p>Upload a new game:</p>");
                    out.write("<form name=\"uploadForm\" action=\"game.jsp\" "
                    + "method=\"POST\" enctype=\"multipart/form-data\">"
                    + "<input type=\"file\" name=\"uploadSelect\" value=\"\" width=\"20\" />"
                    + "<br><input type=\"submit\" value=\"Submit\" name=\"uploadSubmitButton\" "
                    + "onclick = \"submitToServlet2('UploadGameServlet');\">"        
                    + "</form>");
 %>

このJavaScriptを呼び出す:

function submitToServlet2(newAction)
    {
       document.uploadForm.action = newAction;
    }

これは次にサーブレットに送られます (いくつかの重要な要素が隠されている可能性があるため、コードは完全に含まれています)

package org.project;

import java.io.*;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
// import servlet stuff
import org.apache.commons.fileupload.*;


public class UploadGameServlet extends HttpServlet {

/** 
* Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");

    if (ServletFileUpload.isMultipartContent(request))
    {
        try 
        {
            // Create a factory for disk-based file items
            FileItemFactory factory = new DiskFileItemFactory();

            // Create a new file upload handler
            ServletFileUpload upload = new ServletFileUpload(factory);

            // Parse the request
            List items = upload.parseRequest(request); /* FileItem */

            File repositoryPath = new File("\\temp");
            DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
            diskFileItemFactory.setRepository(repositoryPath);

            Iterator iter = items.iterator();
            while (iter.hasNext()) 
            {
                FileItem item = (FileItem) iter.next();
                File uploadedFile = new File("\\applets");
                item.write(uploadedFile);
            }            
        }
        catch (FileUploadException ex) 
        {
            Logger.getLogger(UploadGameServlet.class.getName()).log(Level.SEVERE, null, ex);
        }
        catch (Exception ex) 
        {
            Logger.getLogger(UploadGameServlet.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    PrintWriter out = response.getWriter();
    try {
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet UploadGameServlet</title>");  
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Servlet UploadGameServlet at " + request.getContextPath () + "</h1>");
        out.println("</body>");
        out.println("</html>");
    } finally { 
        out.close();
    }
} 

}

4

1 に答える 1

6
File repositoryPath = new File("\\temp");
File uploadedFile = new File("\\applets");

これらのファイルに先行パスまたは絶対パスなしでアクセスしようとすると、現在の作業ディレクトリの下にある名前の付いたファイル (ディレクトリではない) に書き込もうとしtempますapplets。アプリ サーバーでは、通常、現在の作業ディレクトリはbinフォルダーです (使用するアプリ サーバーなどによって異なります)。

いくつかの提案:

  1. ファイルを保存するディレクトリを参照するには、絶対パス (できれば web.xml またはプロパティ ファイルに格納されている) を使用します。
  2. 書き込み先のファイルの名前を指定する必要があります。おそらく、リクエストごとに何らかのランダム/一意の名前を作成する必要があります。
  3. キーストロークを節約し、すべてのLogger.getLogger(UploadGameServlet.class.getName())参照の代わりにメンバー変数を使用してください!
  4. 特にデータを書き込んでいる場所を確認するために、デバッグを追加しますrepositoryPath.getAbsolutePath()。たとえば、 の結果をログに記録します。
于 2008-10-22T16:46:27.837 に答える