使用ajax和Servlet版本3上传文件:request.getPart()为NULL

时间:2018-01-01 06:16:38

标签: ajax servlets primefaces

我的应用程序曾经工作过:我使用的是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.。)我的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.。)我的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 = request.getPart(&#34; file&#34;);返回null。

我该如何解决这个问题?

谢谢你,亲切的问候:Alex

2 个答案:

答案 0 :(得分:1)

@Java Samurai:感谢您的建议:我将其应用于我的代码,现在它按预期工作。这是“解决方案”:

    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;
            }
        }

答案 1 :(得分:0)

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