문제

이것은 단지 작동하지 않습니다. 문제는 내가 무슨 일이 일어날 지 알기에 충분히 알지 못한다는 것입니다. 이 코드를 디버깅 할 수 없습니다. 업로드를 임시 폴더 "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();
    }
} 

}

도움이 되었습니까?

해결책

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(), 예를 들어.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top