FormData 对象的使用

Posted 码上猿梦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FormData 对象的使用相关的知识,希望对你有一定的参考价值。

       XMLHttpRequest Level 2 添加了一个新的接口—— FormData。利用 FormData 对象,我们可以通过 javascript 用一些键值对来模拟一系列表单控件,我们还可以使用 XMLHttpRequest 的 send() 方法来异步的提交表单,通过FormData对象可以组装一组用 XmlHttpRequest 发送请求的键/值对。它可以更灵活方便的发送表单数据,因为可以独立于表单使用。如果你把表单的编码类型设置为multipart/form-data ,则通过FormData传输的数据格式和表单通过 submit() 方法传输的数据格式相同,与普通的 Ajax 相比,使用 FormData 的最大优点就是我们可以异步上传二进制文件。

代码上来先:

$(function() {
        $(‘#upload‘).click(ajaxUpload);
    });

    function ajaxUpload() {
        var file1 = $(‘#file1‘)[0].files[0];
        var file2 = $(‘#file2‘)[0].files[0];
        // 创建内存中的表单对象
        var form = new FormData();
        form.append(‘file1‘, file1);
        form.append(‘file2‘, file2);

        $.ajax({
            url : ‘account/upload.do‘,
            data : form,
            type : ‘post‘,
            dataType : ‘json‘,
            contentType : false,
            processData : false,
            success : function(obj) {
                //这里的obj.state来自于JsonResult的成员变量
                //0为正常,1为异常
                if (obj.state == 0) {
                    $(‘#result‘).html("成功");
                } else {
                    $(‘#result‘).html("出现了小错误");
                }
            }
        });
    }

其中 JsonResult 是自定义的一个返回 Json格式的 Java类,在 action中对于异步请求返回的是 Json格式的字符串。

html 部分代码:

Ajax UpLoad:
    <br>
    <input id="file1" type="file">
    <br>
    <input id="file2" type="file">
    <br>
    <input type="button" value="submit" id="upload" />
    <!-- 展示返回信息 -->
    <div id="result"></div>

后台 Controller处理代码:【类名上写了映射 @RequestMapping("/account")】

/**
     * 文件上传
     * @param file1
     * @param file2
     * @return
     * @throws IllegalStateException
     * @throws IOException
     */
    @RequestMapping("/upload.do")
    @ResponseBody
    public Object upload(MultipartFile file1, MultipartFile file2) throws IllegalStateException, IOException {
        // Spring MVC 中可以利用MultiPartFile接收上传的文件
        // 文件中的一切数据都可以从MultiPartFile对象中找到

        // 获取上传文件的原始文件名
        String f1 = file1.getOriginalFilename();
        String f2 = file2.getOriginalFilename();
        System.out.println(f1);
        System.out.println(f2);
        // 保存上传文件的三种方法:
        // 1. transferTo(目标文件) 将上传文件直接保存到目标文件,可以处理大文件
        // 2. file1.getBytes() 获取文件的全部字节,读取到内存中,适合处理小文件
        // 3. file1.getInputStream() 获取上传文件的流,适合处理大文件

        // 第一种保存文件
        File dir = new File("C:/demo");
        dir.mkdir();

        File fl1 = new File(dir, f1);
        File fl2 = new File(dir, f2);

        // file1.transferTo(fl1);
        // file2.transferTo(fl2);

        // 第三种保存文件
        InputStream in = file1.getInputStream();
        FileOutputStream out = new FileOutputStream(fl1);
        int b;
        while ((b = in.read()) != -1) {
            out.write(b);
        }
        in.close();
        out.close();

        InputStream in2 = file2.getInputStream();
        FileOutputStream out2 = new FileOutputStream(fl2);
        byte[] buff = new byte[8 * 1024]; // 8k缓冲区
        int b2;
        while ((b2 = in2.read(buff)) != -1) {
            out2.write(buff, 0, b2);
        }
        out2.close();
        in2.close();

        return new JsonResult(true);
    }

以上是关于FormData 对象的使用的主要内容,如果未能解决你的问题,请参考以下文章

使用 FormData 对象,服务器收到一个空的 POST

JSON对象转成formData对象,formData对象转成JSON对象

JSON对象转成formData对象,formData对象转成JSON对象

js obj对象转formdata格式代码

无法在客户端附加带有多个压缩图像的 FormData() 对象

通过jQuery Ajax使用FormData对象上传文件