【问题标题】:Upload multiple files using AJAX and servlet使用 AJAX 和 servlet 上传多个文件
【发布时间】:2016-01-09 21:59:00
【问题描述】:

我已经尝试了互联网上几乎所有可用的东西,但似乎没有任何效果。

我有一个 HTML5 文件阅读器代码,它将获取从客户端目录var f = $('#fileUpload')[0].files; 读取的所有文件接下来我想通过 AJAX 请求将所有这些文件上传到 JAVA servlet POST 方法。为此,我尝试了以下代码-

var data = new FormData();
        $.each(f, function(key, value)
        {
            data.append(key, value);
        });
postFilesData(data);
//some code..
    function postFilesData(data)
    {
     $.ajax({
        url: 'serv2',
        type: 'POST',
        //enctype: 'multipart/form-data',
        data: data,
        cache: false,
        processData: false, 
        mimetyep: 'multipart/form-data',
        contentType: 'multipart/form-data', 
        success: function(data)
        {
            //success
        },
        error: function(textStatus)
        {
            console.log('ERRORS: ' + textStatus);
        }
        });
    }

servlet 代码 doPOst 方法-

System.out.println("Hi what request:"+ServletFileUpload.isMultipartContent(request));
        System.out.println("hi bro");
    //  awsUpload.uploadData(foldername);
        System.out.println("outside aws");

        DiskFileItemFactory factory = new DiskFileItemFactory();


        ServletFileUpload upload = new ServletFileUpload(factory);

        String uuidValue = "";
        FileItem itemFile = null;

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

            // iterates over form's fields to get UUID Value
            while (iter.hasNext()) {
                FileItem item = (FileItem) iter.next();
                if (item.isFormField()) {

                }
                // processes only fields that are not form fields
                if (!item.isFormField()) {
                    itemFile = item;
                }
            }
        }
            catch (Exception e) {
                // TODO: handle exception
            }

        //System.out.println(path);
    //  response.sendRedirect(path+"/user"+"/home.html");
    //  System.out.println("done");

        if(itemFile==null)
        {
            System.out.println("File Empty Found");
        }
        System.out.println("The File Name is"+itemFile.getName());
}

HTML 代码:

<form method="POST" enctype="multipart/form-data" >

        <input type="file" class="input-file" name="file[]" id="fileUpload" 
        onchange="fileChanged();" multiple mozdirectory="" 
        webkitdirectory="" directory=""/> <br/>

它打印“找到空文件”并在下一行崩溃并出现 NullPointerException。我知道它没有得到任何数据。您能否指出一段错误的代码或需要添加的代码缺失。

【问题讨论】:

  • 还有很多可以调试和确定的,但你没有告诉任何关于它的字/细节。首先解决这个问题,然后将问题简化为那个。例如,它是多部分内容吗?是否进入了while循环?真的没有例外吗? (您的代码有一个空的 catch 块,它会忽略任何异常并继续执行代码,就好像没有发生任何异常情况一样)。

标签: javascript java jquery ajax servlets


【解决方案1】:

谢谢大家的回复..!! 要回答@BalusC 的问题,是的,它是分段上传。它进入了 while 循环,但没有从 ajax 调用传输数据,并且代码刚刚在 line-System.out.println("The File Name is"+itemFile.getName()); 处中断,因为没有要获取 FileName 的项目。我得到的唯一例外是控制台“NullPointerException”和 UI 控制台(在 JS 中调试时)“500 内部服务器错误” 我能够修复代码并能够通过 AJAX 调用将数据传输到 Servlet。下面是代码。用于 AJAX 调用和 servlet 代码的代码几乎已更改/重组--

AJAX 请求--

var fd = new FormData();    
    //fd.append( 'file', $('#fileUpload')[0].files);//.files[0]);

    $.each($('#fileUpload')[0].files, function(k, value)
            {
                fd.append(k, value);
            });

    $.ajax({
      url: 'serv2',
      data: fd,
      processData: false,
      contentType: false,
      type: 'POST',
      success: function(data){
        alert(data);
      }
    });

Servlet 代码-doPost 方法--

if (!ServletFileUpload.isMultipartContent(request)) {
            PrintWriter writer = response.getWriter();
            writer.println("Request does not contain upload data");
            writer.flush();
            return;
        }
        // configures upload settings
        DiskFileItemFactory factory = new DiskFileItemFactory();
        factory.setSizeThreshold(THRESHOLD_SIZE);

        ServletFileUpload upload = new ServletFileUpload(factory);
        //upload.setFileSizeMax(MAX_FILE_SIZE);
        //upload.setSizeMax(MAX_REQUEST_SIZE);

        String uuidValue = "";
        FileItem itemFile = null;

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

            // iterates over form's fields to get UUID Value
            while (iter.hasNext()) {
                FileItem item = (FileItem) iter.next();
                if (item.isFormField()) {
                    if (item.getFieldName().equalsIgnoreCase(UUID_STRING)) {
                        uuidValue = item.getString();
                    }
                }
                // processes only fields that are not form fields
                if (!item.isFormField()) {
                    itemFile = item;
                }
            }
            System.out.println("no of items: " + formItems.size());
            System.out.println("FILE NAME IS : "+itemFile.getName());
    }
}

我无法打印从 UI 传递的正确文件对象。谢谢你们的时间..!! :)

【讨论】:

    猜你喜欢
    • 2012-02-10
    • 1970-01-01
    • 2013-12-01
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    相关资源
    最近更新 更多