2017-10-05 2 views
0

jquery ajax FormData을 사용하여 이미지를 업로드하는 경우 servlet으로 ajax 요청을하려고했습니다. 하지만 난 항상 서블릿에서 에러 응답을 받고있다.서블릿으로 jquery ajax FormData를 사용할 수 없습니다.

JSP 파일

package org.wpits.ussd; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.PrintWriter; 
import java.net.URLEncoder; 
import java.nio.file.Paths; 
import java.util.ArrayList; 
import java.util.Collection; 
import java.util.Iterator; 
import java.util.List; 

import javax.servlet.RequestDispatcher; 
import javax.servlet.ServletConfig; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.MultipartConfig; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.Part; 

import org.apache.commons.fileupload.FileItem; 
import org.apache.commons.fileupload.disk.DiskFileItemFactory; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 
import org.json.JSONObject; 
import org.wpits.service.DbService; 
import org.wpits.ussd.beans.UserDocs; 

/** 
* Servlet implementation class UploadDocs 
*/ 
@WebServlet("/UploadDocs") 
@MultipartConfig(fileSizeThreshold=1024*1024*2, // 2MB 
maxFileSize=1024*1024*10,  // 10MB 
maxRequestSize=1024*1024*50) // 50MB 
public class UploadDocs extends HttpServlet { 
    private static final long serialVersionUID = 1L; 
     private DbService dbService = new DbService(); 
     private String filePath; 

    public UploadDocs() { 
     super(); 
    } 

    @Override 
    public void init(ServletConfig config) throws ServletException { 
     // TODO Auto-generated method stub 
     super.init(config); 
      filePath = getServletContext().getInitParameter("file-upload"); 
    } 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     response.setContentType("text/html"); 
     String savePath = filePath; 
     String amount = request.getParameter("amount"); 
     System.out.println(amount); 
     File fileSaveDir = new File(savePath); 
     if (!fileSaveDir.exists()) { 
      fileSaveDir.mkdir(); 
     } 

     for (Part part : request.getParts()) { 
      String fileName = extractFileName(part); 
      if(fileName!=null && !fileName.equals("")){ 
      InputStream is = part.getInputStream(); 
      File f = new File(savePath+File.separator+fileName); 
      copyInputStreamToFile(is,f); 
      } 
     } 
    } 

    private void copyInputStreamToFile(InputStream in, File file) { 
     try { 
      OutputStream out = new FileOutputStream(file); 
      byte[] buf = new byte[1024*1024*10]; 
      int len; 
      while((len=in.read(buf))>0){ 
       out.write(buf,0,len); 
      } 
      out.flush(); 
      out.close(); 
      in.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    private String extractFileName(Part part) { 
      String contentDisp = part.getHeader("content-disposition"); 
      String[] items = contentDisp.split(";"); 
      for (String s : items) { 
       if (s.trim().startsWith("filename")) { 
        return s.substring(s.indexOf("=") + 2, s.length()-1); 
       } 
      } 
      return ""; 
     } 
} 

내가 설명 디렉토리 경로에 이미지를 기록 할 수 있어요

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
     pageEncoding="ISO-8859-1"%> 
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
     "http://www.w3.org/TR/html4/loose.dtd"> 
    <html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
     <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 

    <title>File Upload</title> 
    <script> 
    function hitThis(){ 
    alert("hello"); 
    var form1 = document.getElementById("form1"); 
    $.ajax({ 
    url: 'UploadDocs', 
    type: 'POST', 
    data: new FormData(form1), 
    processData: false, 
    contentType: false, 
    success: function(response) { 
    alert("success : "); 
     }, 
    error: function(xhr) { 
      alert("error : "+JSON.stringify(xhr)); 
     //Do Something to handle error 
     } 

    }); 
    } 
    </script> 
    </head> 
    <body> 
    <center> 
     <h1>File Upload</h1> 
     <form id="form1" class="form-inline" onsubmit="hitThis();"> 

      Amount : <input type="text" value="232" name="amount"/><br> 

      Select file to upload: <input type="file" name="file" size="60" /><br /> 
      Select file to upload: <input type="file" name="file" size="60" /><br /> 

      <br /> <input type="submit" value="Upload" /> 
     </form> 
    </center> 
    </body> 
    </html> 

서블릿 : 다음은 내 코드입니다. 하지만 문제는 아약스의 오류 응답으로 항상 리디렉션된다는 것입니다. 또한 tomcat 서버를 다시 시작하고 파일을 업로드하려고 할 때마다 "java.io.IOException: org.apache.tomcat.util.http.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. Stream ended unexpectedly"오류가 발생하여 첫 번째 시도가 실패로 끝난 직후 두 번째 시도에서 위의 코드는 파일을 작성할 수 있지만 Ajax의 오류 기능에 대한 응답은 반환 할 수 없습니다 . 나는 어디에서 실수하고 있니? 어떤 사람이 내 문제를 해결할 수 있다면 매우 도움이 될 것입니다.

+0

어떤 오류가 발생하고 있습니까? –

+0

오류 : { "readyState": 0, "status": 0, "statusText": "error"} – JPG

답변

0

위의 코드에서 문제는 내가 내 양식에 onsubmit()input type="submit"를 사용에만이었다. 즉, onsubmit 이벤트를 제거하고 input type = "submit" 대신 버튼에 onclick 이벤트를 적용하면됩니다. Ajax는 기본 형식과 결합 될 때 불일치하게됩니다.

1

아약스를 발생 시키려면이 형식을 사용하십시오.

//get choosen file 
var fileContent = new FormData(); 
fileContent.append("file",$('input[type=file]')[0].files[0]); 
$.ajax({ 
    type: "POST", 
     enctype:"multipart/form-data", 
     url: "uploadCsvData", 
     data: fileContent, 
     processData: false, 
     contentType: false, 
     success: function(response) { 
     } 
}); 
+0

솔루션이 정상적으로 작동하지만 위 질문에서 볼 수 있듯이 하나 더 파일이 있습니다. 하나의 파일을'fileContent.append ("file", $ ('input [type = file]') [0] .files [0]);'로 추가했습니다. 이제 두 번째 파일을 추가하려면 어떻게해야합니까? – JPG

+0

두 번째 파일도 추가 할 수 있습니다. – Zigri2612