首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用JS fetch重写angular ng-file-upload Upload.upload?

如何用JS fetch重写angular ng-file-upload Upload.upload?
EN

Stack Overflow用户
提问于 2019-05-05 15:45:21
回答 1查看 50关注 0票数 0

我需要从react本机应用程序使用fetch()将文件上传到服务器

我在Angular中有以下代码,它使用ng-file-upload

在此函数文件中,附加了FormData变量

代码语言:javascript
复制
    function addDocumentToMessage(messageId, file) {

        data.filepath = file;
        data.name = file.name;

        return Upload.upload({
                url: BackendUrl + "/messages/" + messageId + "/attachments/",
                file: file,
                data: data
            })
            .then(responseHandler)
            .catch(errorHandler);
    }

我尝试使用fetch()执行以下操作,但它不能正常工作:文件被添加到服务器,但附件和其他字段没有保存在那里。下面是我尝试过的代码:

document = { formData, name }

代码语言:javascript
复制
export const addDocumentToMessage = (token, logId, document) => {
    const file = document.formData
    const data = { filepath: file, name: document.name }

    fetch(`${API_URL}/messages/${logId}/attachments/`, {
        method: 'POST',
        headers: { 'Authorization': `token ${token}`, 'Content-Type': 'multipart/form-data', Accept: 'application/json' },
        body: JSON.stringify({ file: file, data: data })
    })
        .then(response => console.log(response.data))
        .catch(error => console.log(error.message))
}
EN

回答 1

Stack Overflow用户

发布于 2019-05-05 16:36:20

这里似乎混合了两个Content-Types

用于在file

  • application/json中发送文件的二进制内容的
  • multipart/form-data,用于在body

中发送一些JSON数据

由于HTTP请求只支持一个具有一种Content-Type编码的主体,因此我们必须将所有编码统一为multipart/form-data。下面的示例使用变量formData来组合(二进制)文件数据和任意的JSON数据。

代码语言:javascript
复制
export const addDocumentToMessage = (token, logId, document) => {

    // commented these lines since I wanted to be more specific
    // concerning the origin and types of data
    // ---
    // const file = document.formData
    // const data = { filepath: file, name: document.name }

    const fileField = document.querySelector("input[type='file']");
    let formData = new FormData();

    formData.append('file', fileField.files[0]);
    formData.append('name'. fileField.files[0].name);
    formData.append('arbitrary', JSON.stringify({hello: 'world'}));

    fetch(`${API_URL}/messages/${logId}/attachments/`, {
        method: 'POST',
        headers: {
            'Authorization': `token ${token}`,
            'Accept': 'application/json'
            // 'Content-Type': 'multipart/form-data',
        },
        body: formData
    })
        .then(response => console.log(response.data))
        .catch(error => console.log(error.message))
}

HTTP请求正文的有效负载将如下所示:

代码语言:javascript
复制
------WebKitFormBoundarypRlCB48zYzqAdHb8
Content-Disposition: form-data; name="file"; filename="some-image-file.png"
Content-Type: image/png

... (binary data) ...
------WebKitFormBoundarypRlCB48zYzqAdHb8
Content-Disposition: form-data; name="name"

some-image-file.png
------WebKitFormBoundarypRlCB48zYzqAdHb8
Content-Disposition: form-data; name="arbitrary"

{"hello":"world"}
------WebKitFormBoundarypRlCB48zYzqAdHb8--

参考文献:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55989852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档