【问题标题】:Prevent AJAX for sending file as string防止 AJAX 将文件作为字符串发送
【发布时间】:2021-11-18 13:51:06
【问题描述】:

我有一个文件存储在this.form.imagesFile 变量中。它包含以下文件:

我想使用FormDataAJAX 发送它。仅供参考:我正在使用 Vue 和 Laravel。

let getImg = [];
        this.form.variantsProd.forEach((item) => {
            let totalImagesFile = $('.images' + item.id)[0].files.length; //Total Images
            let imagesFile = $('.images' + item.id)[0];
            for (let i = 0; i < totalImagesFile; i++) {
                getImg.push(imagesFile.files[i]);
            }
            this.form.imagesFile = getImg;
        });
        this.form.totalImagesFile = getImg.length;

        let formData = new FormData();
        formData.append('imagesFile', this.form.imagesFile);

        $.ajaxSetup({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'),
            },
        });
        const token = localStorage.getItem('token-staff');
        var self = this;
        $.ajax({
            url: `${BASE_URL}/api/staff/products/store`,
            method: 'post',
            data: formData,
            enctype: 'multipart/form-data',
            cache: false,
            contentType: false,
            processData: false,
            dataType: 'JSON',
            async: true,
            headers: {
                'Content-Type': undefined,
            },
            xhr: function () {
                let myXhr = $.ajaxSettings.xhr();
                return myXhr;
            },
            beforeSend: function (xhr) {
                xhr.setRequestHeader('Authorization', `Bearer ${token}`);
            },
            error: function (response) {
                console.log(response);
            },
            success: function (result) {
                if (result.errors) {
                    console.log(result);
                } else {
                    //
                } //endif
            },
        });

但是当我尝试在控制器中获取文件时,我得到了[object File]。所以,我做gettype($imagesFile),结果是string。这显然是意料之外的结果。我想将文件存储在服务器中。我该怎么做?

public function store(Request $request)
{
    $imagesFile = $this->request->get('imagesFile');

    return response()->json([
            'success' => true,
            'message' => $imagesFile,
        ]);
}

【问题讨论】:

    标签: javascript jquery ajax laravel vue.js


    【解决方案1】:

    this.form.imagesFile 是一个数组,您必须将 File 传递给 FormData 对象。另外,不要设置内容类型。

        let formData = new FormData(); 
        this.form.variantsProd.forEach((item) => {
            let totalImagesFile = $('.images' + item.id)[0].files.length; //Total Images
            let imagesFile = $('.images' + item.id)[0];
            for (let i = 0; i < totalImagesFile; i++) {
                getImg.push(imagesFile.files[i]);
                formData.append('imagesFile', imagesFile.files[i]);
            }
            this.form.imagesFile = getImg;
        }); 
        ...
        $.ajax({
            url: `${BASE_URL}/api/staff/products/store`,
            method: 'post',
            data: formData,
            cache: false,
            contentType: false,
            processData: false,
            dataType: 'JSON',
            async: true,
            beforeSend: function (xhr) {
                xhr.setRequestHeader('Authorization', `Bearer ${token}`);
            },
            error: function (response) {
                console.log(response);
            },
            success: function (result) {
                if (result.errors) {
                    console.log(result);
                } else {
                    //
                } //endif
            },
        });        
    

    您可以通过$request-&gt;file('imagesFile');访问该文件

    【讨论】:

    • 不幸的是null
    • 我只收到{}
    • 似乎工作正常。当我用$request-&gt;hasFile('imagesFile') 测试时,结果是true
    猜你喜欢
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多