POST到服务器之前如何正确将文件附加到formData?

里昂·加班

我在这里一直遵循此FormData教程,但是尚未了解formData对象如何工作。

我的输入表格

在此处输入图片说明

<input type="file" id="file-id" class="w300px rounded4px" name="file" placeholder="PDF file">
<button class="btn-upload-pdf" ng-click="asub.uploadPDF()">Upload</button>

这是上传按钮功能:

this.uploadPDF = () => {
    const formData = new FormData();
    const fileInput = document.getElementById('file-id');
    const file = fileInput.files[0];
    formData.append('pdf-file', file);
    console.log('formData', formData)

    return ApiFactory.insightPDF(formData).then((res) => {
        console.log('res', res);
        return res;
    });
};

当我注销fileInput对象时,.files[0]我看到的是我刚刚附加的文件:

在此处输入图片说明

这似乎意味着该对象应该足以发送到POST。但是,这是下一步:

formData.append('pdf-file', file);

我注销formData后才将其发送到Factory,这就是结果,我看不到pdf-file任何密钥或PDF,只是一堆方法?文件也附加在哪里?formData如何包含实际的PDF?

在此处输入图片说明

我需要从我假定的formData对象中附加一些东西:

发出POST请求的工厂

const insightPDF = (formData) => {
    console.log(' formData', formData)
    return $http.post('/app/api/insights_pdf', formData).then((res) => {
        console.log('PDF uploaded res', res)
        return res;
    }).catch(apiError);
};
乔治

Content-Type: undefined

张贴由FormData API创建的对象时,将内容类型标头设置为很重要undefined

const insightPDF = (formData) => {
    console.log(' formData', formData)
    var config = { headers: {'Content-Type': undefined} };
    return $http.post('/app/api/insights_pdf', formData, config)
     .then((res) => {
        console.log('PDF uploaded res', res)
        return res;
    }).catch(apiError);
};

通常,AngularJS框架会自动添加内容类型标头,因为application/json它会覆盖XHR Send()方法设置的内容类型XHR API发送FORMDATA对象时,它自动将内容类型设置到multipart/form-data用适当的边界。

从文档中:

$ http服务将自动向所有请求添加某些HTTP标头

要显式删除$httpProvider.defaults.headers根据每个请求自动添加的标头,请使用headers属性,将所需的标头设置为undefined例如:

var req = {
 method: 'POST',
 url: 'http://example.com',
 headers: {
   'Content-Type': undefined
 },
 data: { test: 'test' }
}

— AngularJS $ http服务API参考-设置HTTP标头

FormData对象(例如blob)是非JavaScript的主机定义对象。console.log不能看到它们的所有属性console.dir文件是Blob的一种特殊类型。数据不一定从磁盘加载。通常,仅在特定API需要时才从磁盘流式传输数据。


避免额外开销-直接发送文件

中的内容multipart/form-data使用base64编码,这会增加33%的额外开销。如果仅上传一个文件,则直接发送文件Blob效率更高。

//MORE Efficient; Avoids base64 encoding overhead

const insightPDF = (dataObject) => {
    var config = { headers: {'Content-Type': undefined} };
    return $http.post('/app/api/insights_pdf', dataObject, config)
     .then((res) => {
        console.log('PDF uploaded res', res)
        return res;
    }).catch(apiError);
};

var file = inputElem[0].files[0];
insightPDF(file);

如果服务器可以直接接受二进制内容,则最好以这种方式发送文件。XHR API将自动设置内容类型的文件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将 POST 请求发送到其他服务器绑定文件到 formdata

如何将文件附加到 formData

服务器端无法捕获附加formdata文件

LAN 中的多台机器将行附加到服务器文件。如何避免可能的冲突?

如何将节点 js 服务器中的 html 格式数据附加到客户端的 html 文件中?

将调试器附加到Strapi服务器

如何使用jquery将多个文件附加到formdata中

如何将图像文件附加到 formData

使用 PowerShell 将数据附加到 FTP 服务器上的 CSV 文件

如何将客户端数据附加到服务器连接?

服务器推送时如何在客户端将数据附加到div

如何将javascript文件从同一目录中的javascript文件附加到主体。Java服务器面临2个JSF2

如何在将文件发送到服务器之前删除文件?

如何在将文件上传到服务器之前验证用户发送的文件?- Javascript

在将值发布到服务器之前显示HUD

在将消息发布到服务器之前,如何从SOAP请求中删除标头元素

如何上传文件到服务器?

如何将Blob附加到FormData

将FTP服务器上现有的文件附加到C#.NET中的邮件

使用 AJAX Post 将 Excel 文件传递到服务器

节点-附加到服务器/ websockets

如何将.Jar文件正确附加到HTML

如何正确地将多个合并还原到远程主服务器

如何正确地将图像发布到alchemy node.js服务器?

您如何正确地将第二个Pinpad添加到ChipDNA服务器配置文件?

Shell 脚本:如何将文件列表从服务器 1 复制到服务器 2

如何使用PHP将文件从托管服务器复制到本地驱动器

SaltStack:如何将文件从小兵复制到SaltStack文件服务器

如何将文件发布到php服务器文件夹