jQuery 使用ajax和java servlet上传文件

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/20052471/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-27 00:55:46  来源:igfitidea点击:

Uploading file with ajax and java servlet

jqueryajaxjspservlets

提问by Razvan N

I am trying to upload a csv file inside from a jsp page using a servlet that extends HttpServlet. Inside the jsp page I am using an ajax that should call the servlet.

我正在尝试使用扩展 HttpServlet 的 servlet 从 jsp 页面上传一个 csv 文件。在jsp 页面中,我使用了一个应该调用servlet 的ajax。

This is the ajax part:

这是ajax部分:

    $(function() {
    $(".upldBtn").click(function() {

        alert("Upload button pushed");

        $.ajax({
            type: "POST",
            url: contextPath + servletPath,
            data: "action=get&custIdList=" + $('#custIdList').val(),
            async: false,
            dataType: "text/csv; charset=utf-8", 
            success: function(data){
                  alert("success");
              }
        });
    });

The contextPath and servletPath are also declared, I didn't specified them here.

还声明了contextPath 和servletPath,这里我没有指定。

In the jsp page, I have this form inside a table :

在jsp页面中,我在表格中有这个表格:

<form method="post" action="CSRUploadListServlet" enctype="multipart/form-data">
<input type="file" name="custIdList" id="custIdList" />
<input type="submit" value="Upload" class="upldBtn" />
</form>

Inside the servlet, I want to use this doPost method:

在 servlet 内部,我想使用这个 doPost 方法:

protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {

    String methodName = "doPost";

    logger.debug("[{}] call", methodName);

    // checks if the request actually contains upload file
    if (!ServletFileUpload.isMultipartContent(request)) {
        PrintWriter writer = response.getWriter();
        writer.println("Request does not contain upload data");
        logger.debug("[{}] Request does not contain upload data",
                methodName);
        writer.flush();
        return;
    }

    // configures upload settings
    DiskFileItemFactory factory = new DiskFileItemFactory();
    factory.setSizeThreshold(THRESHOLD_SIZE);
    factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
    logger.debug("[{}] factory= {} ", methodName, factory);

    ServletFileUpload upload = new ServletFileUpload(factory);
    upload.setFileSizeMax(MAX_FILE_SIZE);
    upload.setSizeMax(MAX_REQUEST_SIZE);
    logger.debug("[{}] upload= {} ", methodName, upload);

    // constructs the directory path to store upload file
    String uploadPath = getServletContext().getRealPath("")
            + File.separator + UPLOAD_DIRECTORY;
    // creates the directory if it does not exist
    File uploadDir = new File(uploadPath);
    if (!uploadDir.exists()) {
        uploadDir.mkdir();
        logger.debug("[{}] upload directory = {} ", methodName,
                uploadDir.mkdir());
    }

    try {
        // parses the request's content to extract file data
        List formItems = upload.parseRequest(request);
        Iterator iter = formItems.iterator();

        // iterates over form's fields
        while (iter.hasNext()) {
            FileItem item = (FileItem) iter.next();
            // processes only fields that are not form fields
            if (!item.isFormField()) {
                String fileName = new File(item.getName()).getName();
                String filePath = uploadPath + File.separator + fileName;
                File storeFile = new File(filePath);

                // saves the file on disk
                item.write(storeFile);
            }
        }
        request.setAttribute("message",
                "Upload has been done successfully!");
        logger.debug("[{}] Upload has been done successfully! ", methodName);
    } catch (Exception ex) {
        request.setAttribute("message",
                "There was an error: " + ex.getMessage());
        logger.debug("[{}] There was an error: {} ", methodName, ex);
    }
    getServletContext().getRequestDispatcher(
            "/WEB-INF/web/csrCustomerLists/message.jsp").forward(request,
            response);
}

All this gets stuck at if (!ServletFileUpload.isMultipartContent(request)), returning that: 'Request does not contain upload data'.

所有这些都停留在if (!ServletFileUpload.isMultipartContent(request)),返回:“请求不包含上传数据”。

I am sure that I am not writing the ajax correctly, but I can't seem to find out where I am doing it wrong.

我确信我没有正确编写 ajax,但我似乎无法找出我做错的地方。

Thanks.

谢谢。

采纳答案by user3256429

Hei! Try to put your html code differently, and then call the servlet from ajax, just the way you did there. I think the problem may be in the form you are using, that is rewriting some attributes or something like that.

嘿!尝试以不同的方式放置您的 html 代码,然后从 ajax 调用 servlet,就像您在那里所做的那样。我认为问题可能出在您使用的表单中,即重写一些属性或类似的东西。

I suggest an option with an iframe, loaded from the js code.The html code can be like this:

我建议一个带有 iframe 的选项,从 js 代码加载。 html 代码可以是这样的:

<button id="upldBtn" title="Upload" >Do the upload</button>

<div id="textarea" style="display: none;"></div>

<input type="file" class="file" id="file" name="file" title="Please upload"/>

And the javascript code:

和 javascript 代码:

    $(function() { 

    $('#upldBtn').click(function() {
        var contextPath = 'your path string';
        var servletName = 'your servlet name string';
        var iframe = $('<iframe name="postiframe" id="postiframe" style="display: none" />');
        $("body").append(iframe);

         $("form#yourform").attr('action', contextPath+servletName);
         $("form#yourform").attr('enctype', "multipart/form-data");
         $("form#yourform").attr("target", "postiframe");
         $("form#yourform").attr("file", $('#file').val());

        $('yourform').submit(); //upload button 
             $("#postiframe").load(function () {
                    iframeContents = $("#postiframe")[0].contentWindow.document.body.innerHTML;
                    $("#textarea").html(iframeContents);
                            $.ajax({
                                    type: "GET",
                                    url: contextPath+servletName,
                                    data: "action=download",
                                    async: false,
                                    dataType: "text",
                                    success: function(result) {
                                        //do something
                                    }
                                });
                } });
            }); 
});

Tell me if it is ok for you. :) Cheers

告诉我是否适合你。:) 干杯