我们有一个remix应用程序,它需要上传一个文件并将其转发到django后端(django rest框架)。然而,django后端没有收到请求中的任何数据。
在remix后端,我们有一个动作来上传文件:
export const action = async ({ request }: ActionFunctionArgs) => {
const user = await auth.isAuthenticated(request, {
failureRedirect: paths.login,
});
const uploadHandler = unstable_createMemoryUploadHandler({
maxPartSize: 500_000,
});
const formData = await unstable_parseMultipartFormData(
request,
uploadHandler,
);
const response = await axios.post("/assets/upload/", formData, {
headers: {
"Content-Type": "multipart/form-data",
},
});
};
字符串
在这个动作中,formData看起来很好。它有一个条目[“myFile”,]。看起来Content-Length头并没有自动生成。Django接收到Content-Length的值为0。但是,边界会自动添加到Content-Type头。
我们尝试了很多方法来解决这个问题。例如,从FormData对象中阅读文件到Blob中,并使用它创建一个新的FormData对象:
const fileToBlob = async (file: File) =>
new Blob([new Uint8Array(await file.arrayBuffer())], { type: file.type });
const formDataNew = new FormData();
formDataNew.append(
"myFile",
await fileToBlob(formData.get("myFile") as File),
);
型
或者使用form-data库创建一个新的FormData对象,并使用formDataFromLib.getHeaders()
或"Content-Length": formDataFromLib.getLengthSync()
手动计算和设置content-length header。或者根本不设置header(让axios处理事情- axios然后将content-type设置为application/json
).都不起作用。
对此有什么想法吗?
1条答案
按热度按时间tct7dpnv1#
由于Remix使用
fetch
API,因此您可以将正文直接流式传输到后端,而无需中间处理。字符串
为了验证,这里是“后端”端点。它将保存到
./uploads
目录。型