代码之家  ›  专栏  ›  技术社区  ›  Alex Mi

使用ajax和Servlet版本3:request上载文件。getPart()为空

  •  0
  • Alex Mi  · 技术社区  · 8 年前

    我的应用程序曾经正常工作:我使用的是PrimeFaces 6,但我想使用Servlet版本3和ajax上传一个文件。

    我使用这些源代码开发代码:

    using two forms in a JSF template

    Upload a file using Servlet 3.0

    Mozilla Guide for using ajax to upload an image - part I

    Mozilla Guide for using ajax to upload an image - part II

    在我的模板(视图)中,我有两个表单。第一个用于收集客户数据,第二个是我使用ajax(Java脚本)和servlet版本3为该客户上传图片的表单。一切正常,但在负责处理我上传的图像的servlet中,我得到了对部件的空引用。这里是我的代码:

    1)视图摘录(PrimeFaces facelet):

     <h:form id="newCustomerformId">
      <!-- rest of code not shown here -->
       <p:commandButton type="submit" value="Create Customer"
                                        icon="ui-icon-check"
                                        actionListener="#   {newCustomerBean.saveNewCustomer}"
                                        update = "@form"
                                        oncomplete="ajaxUploadFile();"/>            
    
        </h:form>
    
        <h:form id="uploadImageForNewCustomerformId"
            enctype="multipart/form-data">
            <div id="dropzone">
                <img id="librarypreview" src='' alt='library'
                        style="width: 280px; height: 160 px;" />
                 <select name="top5" id="flist" size="5" onchange="previewFile()">
                 </select>
                <output id="list"> </output>
            </div>
                <input id="fileInput" type="file" multiple="multiple"></input>
                <span id="uploadStatusId"></span>
       </h:form>
    

    2.)My ajaxUploadFile()JavaScript函数:

    function ajaxUploadFile() {
        var form = document.getElementById('uploadImageForNewCustomerformId');
    
        if (form == null)
            return;
    
         var formData = new FormData(form);
    
         for (var i = 0; i < fileList.length; i ++){
           //append a File to the FormData object
           formData.append("file", fileList[i], fileList[i].name);
         }
    
        var uploadStatusOutput = document.getElementById("uploadStatusId");
        var request = new XMLHttpRequest();
        request.open("POST", "/javakurs3-biliothek-jsf-mobile/fileUpload");
        request.responseType = 'text';
        request.onload = function(oEvent) {
    
            if (request.readyState === request.DONE) {
                if (request.status === 200) {
                    if (request.responseText == "OK") {
                        form.action = "/javakurs3-biliothek-jsf-mobile/pages/customers.jsf";
                        form.submit();
                        return;
                    }
                } 
                uploadStatusOutput.innerHTML = "Error uploading image";
    
            } // request.readyState === request.DONE
    
        };  // function (oEvent)
    
        request.send(formData);
    };
    

    3.)My servlet版本3处理上载的图像:

    @WebServlet("/fileUpload")
    @MultipartConfig
    public class ImageUploadServlet extends HttpServlet {
    
    
    
        @Override
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException {
    
            HttpSession session = request.getSession(false);
    
            System.out.println(session);
    
            Long savedKundeId = (Long) session.getAttribute(NewCustomerBean.SESSION_ATTRIBUTE_CUST_ID);     
    
            Part filePart = null;
            PrintWriter pw = null;
            try {
                filePart = request.getPart("file");
    

    我的问题是filePart=请求。getPart(“文件”);返回null。

    我如何解决这个问题?

    谢谢你并致以诚挚的问候:亚历克斯

    2 回复  |  直到 8 年前
        1
  •  1
  •   Alex Mi    8 年前

    @Java武士:谢谢你的建议:我把它应用到我的代码中,现在它按预期工作。以下是“解决方案”:

        Part filePart = null;
        String fileNamer = null;
    
    
        try {
            for (Part fPart : request.getParts()){
                if (fPart.getName()!=null && fPart.getName().equals("file") && StringUtils.isNotEmpty(fPart.getSubmittedFileName())){
                    fileNamer =  fPart.getSubmittedFileName();
                    filePart = fPart;
                    break;
                }
            }
    
        2
  •  0
  •   Java Samurai    8 年前

    您应该使用getParts获取所有部件并检查名称。我认为“