关于php:$。ajax发送文件formdata和变量

$.ajax Sending File formdata along with variables

我正尝试按照本教程中的步骤创建一个简单的jquery文件上传:http://net.tutspus.com/tutorials/javascript-ajax/uploading-files-with-ajax/,它功能齐全且非常出色。但是,我希望对用户可以上载的图像有更多的控制和安全性,例如,我希望能够发送一个令牌。这是我的原始代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 $('#images').change(function (evt) {
    $('#response').text("Uploading . . .");
    var amount = this.files.length;
    var reader, file;
    alert(formdata);
    for (var i = 0; i < amount; i++ ) {
        file = this.files[i];
        if (!!file.type.match(/image.*/)) {
            if ( window.FileReader ) {
                reader = new FileReader();
                reader.onloadend = function (e) {
                    appendUploadedPic(e.target.result, file.fileName);
                };
                reader.readAsDataURL(file);
            }
            if (formdata) {
                formdata.append("images[]", file);
            }
        }  
    }

    if (formdata) {
        $.ajax({
            url:"php/upload.php",
            type:"POST",
            data: formdata,
            dataType:'json',
            processData: false,
            contentType: false,
            success: function (res) {
                $('#response').html(res['image_name']);
            }
        });
    }
});

到目前为止,PHP很简单

1
2
3
4
5
6
7
8
9
foreach ($_FILES["images"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $name = $_FILES["images"]["name"][$key];
        move_uploaded_file( $_FILES["images"]["tmp_name"][$key],"../members/" . $_FILES['images']['name'][$key]);
    }
}

$respond = array("filename" => $_FILES["images"]["name"][0],"type" =>"image");
echo json_encode($respond);

现在我想做的是

1
2
3
4
5
6
7
8
9
10
11
 $.ajax({
            url:"php/upload.php",
            type:"POST",
            data: 'token=someToken&code=upload&data='+formdata,
            dataType:'json',
            processData: false,
            contentType: false,
            success: function (res) {
                $('#response').html(res);
            }
        });

有可能吗?如果是,我如何从PHP中读取它?它是一个post方法,我通常使用一个$_post['code']和一个$_post'token'],但是我如何读取images formdata对象?


如果formdata是用formdata创建的,则需要附加如下字段:

1
formdata.append(name, value);

因此,如果要添加一个令牌字段和一个代码字段,它是:

1
2
3
4
5
if (formdata) {
    formdata.append("images[]", file);
    formdata.append("token","someToken");
    formdata.append("code","someCode");
}

但是,您应该知道,这种上传方法不会得到很多浏览器的支持,即IE6-IE9,我相信它代表了大约一半的互联网用户。

我建议使用一个插件来检测浏览器支持并使用最佳可用方法。我写这个插件就是为了这个目的:

https://github.com/lpology/simple-ajax-uploader

顶部有一个演示链接,可供试用。如果你决定使用它并遇到任何问题,我和我就可以帮你解决。祝你好运。