Apache Commons FileUpload 사용
-
03-07-2019 - |
문제
이것은 단지 작동하지 않습니다. 문제는 내가 무슨 일이 일어날 지 알기에 충분히 알지 못한다는 것입니다. 이 코드를 디버깅 할 수 없습니다. 업로드를 임시 폴더 "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
폴더 (사용하는 앱 서버 등에 따라 다릅니다).
몇 가지 제안 :
- 파일을 저장하려는 디렉토리를 참조하려면 절대 경로 (바람직하게는 web.xml 또는 속성 파일에 저장)를 사용하십시오.
- 작성하려는 파일의 이름을 지정해야합니다. 아마도 요청 당 임의/고유 이름을 만들고 싶을 것입니다.
- 키 스트로크를 저장하고 모든 대신 멤버 변수를 사용하십시오.
Logger.getLogger(UploadGameServlet.class.getName())
참조! - 디버깅 추가, 특히 데이터를 작성하는 위치를 확인하려면 결과를 기록하십시오.
repositoryPath.getAbsolutePath()
, 예를 들어.
제휴하지 않습니다 StackOverflow