jquery+Thinkphp 通过拼装formdata实现ajax上传多个文件

浏览:6365 发布日期:2016/01/09 分类:技术分享 关键字: ajax,upload,多个文件
使用ThinkPHP 封装的upload类可以实现表单内单文件和多文件的上传,但对于无form表单通过ajax形式提交的问题,结合我实际项目在这儿献下丑.
jquery的formdata可以拼装一个表单的数据通过get,post或者ajax.get,ajax.post方式提交数据.下面直接上代码.
html部分::<li class="list-group-item disabled select-file-div">
    <input type="file" multiple="true" class="input-sm clear-l-r-padding select-file" data-uploadtype="photo"/>
</li>
input会被渲染成一个选择文件的按钮,设置其"multiple"属性为true,以便实现多选.
js部分(jquery):var i,
data = new FormData();
...
for (i = 0; i < $('.select-file').files.length; i++) {
        data.append('file[]', this.files[i]);
     }
...//省略代码若干...在选择完成后调用下面$.ajax
$.ajax({
    url: 'url'
    type: "POST",
    data: data,
    dataType: 'json',
    processData: false,// *重要,确认为false
    contentType: false,
    beforeSend: function () {
          ...  },
    success: function (res) {
          console.log(res);
  },
    error: function (res) {
        ...}
});
"data.append('file[]', this.files[i])"这句中,若想上传多个文件请务必设置data.append的键为数组样式的字符串即'xxx[]',原因是Thinkphp的upload方法可以接收数组形式的数据.
php部分:config = array(
    'maxSize' => 3145728,
    'rootPath' => './Public/resource/i/',
    'savePath' => '',
    'saveName' => array('uniqid',''),
    'exts' => array('jpg', 'gif', 'png', 'jpeg'),
    'autoSub' => true,
    'subName' => array('date','Ymd'),
);
$upload = new Upload($config);// 实例化上传类
// 上传文件
$info = $upload->upload();
if (!$info) {// 上传错误提示错误信息
    $this->ajaxReturn( $upload->getError());
    //$this->ajaxReturn($_POST['type']);
} else {// 上传成功
    $this->ajaxReturn($info);
}
Upload类的使用方法参考3.2.3手册的p297.
测试部分:
ok,选择4张图片然后测试一下,会发现chrome调试工具中"NETWORK"产生xhr连接,且status=200,在下方console中可以看见我们打印的返回字符串即upload方法成功后返回的$info数组.

现在我们看看我们使用formdata产生request头信息.(点击name访问的url地址,滚动至最下端)

图中4个request也就是我们ajax.post提交的file对象.
基本功能就是这样.
最佳答案
评论( 相关
后面还有条评论,点击查看>>