代码之家  ›  专栏  ›  技术社区  ›  Michail Michailidis

是否可以上载多个文件,获取其ID,然后使用ImageInput将这些ID绑定到父资源?

  •  0
  • Michail Michailidis  · 技术社区  · 7 年前

    从我所看到的情况来看,当我按下表单提交时,所有动作都会发生,表单包含:

    <ImageInput multiple source="pictures" accept="image/*">
      <ImageField source="src" title="title" />
    </ImageInput>
    

    然后运行一些类似的代码:

    const addUploadCapabilities = requestHandler => (type, resource, params) => {
        if ( (type === 'CREATE' || type === "UPDATE")) {
            if (params.data.pictures && params.data.pictures.length) {
                const pictures = params.data.pictures.filter(p => p.rawFile instanceof File)
    
                const url = config.uploadImageEndpoint;
                //the params contain the image as a fileInstance
                params.data.pictures = [];
                for (let picture of pictures) {
                    let form = new FormData();
                    form.append('file', picture.rawFile);
                    let options = APIUtils.createOptionsForImageUpload(form);
                    return fetchUtils.fetchJson(url, options)
                    .then(res => {
                        params.data.pictures.push({id: res.json.content[0].id});
                        return requestHandler(type, resource, params)
                    });
                }
            }
        }
    
        return requestHandler(type, resource, params);
    };
    

    然后运行restClient代码以在创建或编辑时保存表单的资源。。

    我很好奇这些文件保存到数据库后如何获取ID。。然后提交表单并将这些ID连接到特定的ImageInputs。。

    编辑:

    使用上面的代码,我只得到一个带有图片第一个id的数组

    3 回复  |  直到 7 年前
        1
  •  2
  •   Michail Michailidis    7 年前

    根据kunal pareek的回答,这是收集所有ID的完整代码,然后您可以将它们绑定到父资源:

    const addUploadCapabilities = requestHandler => (type, resource, params) => {
        if ( (type === 'CREATE' || type === "UPDATE")) {
            if (params.data.pictures && params.data.pictures.length) {
                const pictures = params.data.pictures.filter(p => p.rawFile instanceof File)
    
                const url = "some url";
                //the params contain the image as a fileInstance
                params.data.pictures = [];
                let promises = [];
                for (let picture of pictures) {
                    let form = new FormData();
                    form.append('file', picture.rawFile);
                    let options = // create options without content type and body as form
                    let promise = fetchUtils.fetchJson(url, options);
                    promises.push(promise);
                }
                return Promise.all(promises).then(results => {
                    for (let res of results) {
                        params.data.pictures.push(res.json.content[0].id);
                    }
                    return requestHandler(type, resource, params);
                });
            }
        }
    
        return requestHandler(type, resource, params);
    };
    

    const detectPicturesAndUpload = function(properties, params, requestHandler, type, resource) {
        let promises = [];
        for (let prop of properties) {
            if (params.data[prop] && params.data[prop].length) {
                const pictures = params.data[prop].filter(p => p.rawFile instanceof File);
                const alreadUploadedPics = params.data[prop].filter(p => !p.rawFile);
                const url = config.uploadImageEndpoint;
                //the params contain the image as a fileInstance
                params.data[prop] = [];
    
                for (let picture of pictures) {
                    let form = new FormData();
                    form.append('file', picture.rawFile);
                    form.append('property', prop); // the endpoint needs to return the prop name
                    let options = APIUtils.createOptionsForImageUpload(form);
                    let promise = fetchUtils.fetchJson(url, options);
                    promises.push(promise);
                }
                for (let uploadedPic of alreadUploadedPics) {
                    if (!Array.isArray(params.data[prop])) {
                        params.data[prop] = [];
                    }
                    params.data[prop].push(parseInt(uploadedPic.id));
                }
            }
        }
        return Promise.all(promises).then(results => {
            for (let res of results) {
                let propName = res.json.content[0].property; // so it can be used here
                if (!Array.isArray(params.data[propName])) {
                    params.data[propName] = [];
                }
                params.data[propName].push(parseInt(res.json.content[0].id));
            }
            return requestHandler(type, resource, params);
        });
    }
    
    
    const addUploadCapabilities = requestHandler => (type, resource, params) => {
        if ( (type === 'CREATE' || type === "UPDATE")) {
            return detectPicturesAndUpload(["pictures1", "pictures2"], params, requestHandler, type, resource);
        }
    
        return requestHandler(type, resource, params);
    };
    
    export default addUploadCapabilities;
    
        2
  •  1
  •   Michail Michailidis    7 年前

    目前还没有明确的规范机制。AOR希望我们只通过一个调用在API端处理图像上传。我必须说,上面的内容是一个有用的功能。

    const addUploadCapabilities = requestHandler => (type, resource, params) => {
        if ( (type === 'CREATE' || type === "UPDATE")) {
            if (params.data.pictures && params.data.pictures.length) {
                debugger;
    
    const pictures = params.data.pictures.filter(p => p.rawFile instanceof File)
              let form = new FormData()
              const url = imageUploadURL
              const options = {}
              //the params contain the image as a fileInstance
              form.append('image', params.data.pictures[0].rawFile);         
              options.method = 'POST'
              options.body = form
              return fetchUtils.fetchJson(url, options)
              .then(res => {
                   params.data.pictureId = res.json.id
                   return requestHandler(type, resource, params)
                  })
    
                );
            }
        }
    
        return requestHandler(type, resource, params);
    };
    
        3
  •  1
  •   Gildas Garcia    7 年前

    另一种方法是使用自定义输入来处理上传。看见 admin on rest send extra params to rest call