代码之家  ›  专栏  ›  技术社区  ›  Jacobo

Laravel:发送包含多部分表单数据的值时,为foreach()提供的参数无效

  •  0
  • Jacobo  · 技术社区  · 6 年前

    multipart-form-data 请求。

    在我的js代码中,我向formData添加了我需要的对象:

    for (const key in property) {
        if (typeof property[key] !== 'undefined') {
            console.log(key, property[key]);
            formData.append(`property[${key}]`, property[key]);
        }
    }
    

    enter image description here

    所以,在我的控制器里,我必须跟随

     // Images that are already in database
     $propertyData = $request->input('property');
     $images = isset($propertyData['images'])? $propertyData['images'] : []
     foreach($images as $i) {
        $image = Image::find((int)$i['id']);
        if ( !is_null($image) ) {
            $image->update($i);
        }
    }
    

    但我错了: Invalid argument supplied for foreach()

    我甚至尝试将javascript代码中的每个图像转换为类似属性的数组,但是我得到了相同的错误。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Paras    6 年前

    FormData . 必须逐个添加键和值。

    方法如下:

    var formData = new FormData;
    var arr = ['this', 'is', 'an', 'array'];
    for (var i = 0; i < arr.length; i++) {
        formData.append('arr[]', arr[i]);
    }
    

    我使用一个helper函数(请注意,这是ES6语法)来实现这一点:

    export function appendFormdata(formData, data, previousKey) {
        if (data instanceof Object) {
            Object.keys(data).forEach(key => {
                const value = data[key];
                if (previousKey) {
                    key = `${previousKey}[${key}]`;
                }
                if (value instanceof Object && !Array.isArray(value) && !(value instanceof File)) {
                    return appendFormdata(formData, value, key);
                }
                if (Array.isArray(value)) {
                    value.forEach((val, i) => {
                        return appendFormdata(formData, val, `${key}[${i}]`);
                    });
                } else {
                    formData.append(key, value);
                }
            });
        }
    }
    

    有关更多详细信息,请参阅: appending array to FormData and send via AJAX Convert JS Object to form data