reactjs - React Fetch POST 删除带有标题 Content-type = application/x-www-form-urlencoded 的字符
问题描述
我正在使用react withfetch
将图像发送到服务器。
我曾尝试使用 Content-type = application/x-www-form-urlencoded
将我的数据传递给服务器,但它用空格替换特殊字符(即+
变为 a space
)。
我已将标题切换为,Content-type: multipart/form-data
但这会引发错误
加载资源失败:服务器响应状态为 500(内部服务器错误)。
我已经为Content-type
as添加了一个边界boundary=abcdefg
。
这并没有改变任何东西,我不确定我的边界是什么。
不可能通过关于边界的直接示例找到明确的答案。
我发送的数据是一个大字符串。
如果需要,我也可以发布。
这是导致问题的代码示例:
SaveTest4(data: string) {
const options = {
method: 'post',
headers: {
"Content-type": "multipart/form-data; boundary=abcdefg"
},
body: 'data=' + data
}
fetch('api/DataPoint/AddTest4', options);
}
解决方案
根据您的部分分析,听起来您正在尝试发送 base64 编码的数据。内容类型application/x-www-form-urlencoded
将导致服务器执行 URL 解码,这会将+
内容正文中的每个实例替换为空格字符。
当您使用内容类型时multipart/form-data
,服务器将失败并显示状态 500,因为您提供的数据不是正确构造的 MIME 文档。
我的通灵调试能力告诉我,您正在尝试将 base64 编码的文件发布到需要 JSON 文档的 ASP.NET MVC WebAPI 端点。您可能有一个如下所示的控制器方法:
[HttpPost("api/DataPoint/AddTest4")]
public void AddTest4([FromBody] string data) { ... }
如果您发送的内容类型为application/json
,则此端点将需要一个如下所示的文档:
"{base64-encoded-data}"
请注意,数据周围有引号,因为带引号的字符串是正确的 JSON 文档。在这种情况下,您只需使用JSON.stringify()
创建带引号的字符串,这将正确转义字符串中的任何引号。
如果您使用 发送application/x-www-form-urlencoded
,则需要发送如下所示的文档:
data={base64-encoded-data}
但是,正如您所注意到的,您必须确保转义有效负载中的所有特殊字符;您可以使用 来执行此操作window.encodeURIComponent()
,这会将每个“+”转换为“%2B”等。
如果您要上传到此端点的文件很大,那么使用FormData
. 这将允许浏览器以块的形式将文件流式传输到服务器,而不是将其读入内存并在 JavaScript 中对其进行 base64 编码。
推荐阅读
- deep-learning - 为什么加载 Pytorch 模型的损失会大大增加?
- sql-server - 不支持的密钥库提供程序在 SSMS 中键入 AZURE_KEY_STORE 创建列加密密钥
- bash - Shell 脚本:按当前日期创建文件夹并将 .png 文件移动到该子文件夹中
- ldap - 无法将 LDAP 身份验证与 JupyterHub 一起使用:Broken Pipe 错误
- sql - 将日期转换为 weekofyear 格式
- c# - 如何连接到 Cosmos MongoDb
- amazon-web-services - aws cloudformation - 权限控制/例程
- javascript - Vue.js 中的 2D 角色动画,setTimeout 的问题
- flutter - 如何从 Flutter initState() 启动 CupertinoSliverRefreshControl{}
- php - Jetstream,laravel 8电子邮件验证不起作用