https://fastapi.tiangolo.com/tutorial/request-files/
*在下面解决*
我得到了一个适当大小的字节数组,但我不确定如何正确解析它以保存收到的表单文件数据。
几乎工作:
@app.post("/uploadfiles/")
async def create_files(files: List[bytes] = File(...)):
out_file = open("files/1.txt", "w") # open for [w]riting as [b]inary
out_file.write( str([(file) for file in files]))
out_file.close()
return {"file_sizes": [len(file) for file in files]}
该脚本生成的文件不再是可读的 .png。我假设我使用的库不正确,但我不确定从哪个开始:HTMLResponse、FastAPI、multipart 或 List 可能?关于如何正确地将这些字节重新组合在一起的任何想法或文档?
编辑
休息一下,再回顾一下 FastAPI 文档,我发现这个特定的字节数据数组是多部分/表单数据数据(所以也许我会找到一个用于读取表单数据/图像的 python 库):
这是生成的数据的一个小示例(前约 100 个字符):
[b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x03\xe8\x00\x00\x01\xf4\x08\x06\x00\x00\x00\xae(\x07-\x00\x00\x01\x86iCCPICC profile\x00\x00(\x91}\x91=H\
我做的!!!
秘诀是 python 的原生字节识别库和操作顺序!!
@app.post("/uploadfiles/")
async def create_files(files: bytes = File(...)):
out_file = open("files/1.jpg", "wb") # open for [w]riting as [b]inary
out_file.write( bytes([(file) for file in files]))
out_file.close()
在文件命名系统上仍有工作要做:) GL 大家!
编辑 2
由于以下答案不起作用,我编写了一个文件名追加器脚本:
@app.post("/uploadfiles/")
async def create_files(files: bytes = File(...)):
with open('C:/data/sample.txt', 'r', encoding='utf-8') as g:
data=g.readlines()
for line in data:
counter = int(line)
with open('C:/data/sample.txt', 'w') as f:
counter = counter + 1
f.write(str(counter))
out_file = open("files/" + str(counter) + ".jpg", "wb") # open for [w]riting as [b]inary
out_file.write( bytes([(file) for file in files]))
out_file.close()
感谢大家的帮助!快乐的黑客:^)
编辑 3
我被告知,我发布的方法与 FastAPI 结合使用可能是不正确的做法,因此为了更好地理解这一点,我发布了发布到后端的相关 javascript:
这是我的 reactjs 表单发布脚本中的相关代码:
onSubmit = (e) => {
e.preventDefault();
const formData = new FormData();
if (this.state.images != null) {
var form = document.getElementById("apiupform");
document.getElementById("apiupform").hidden = true;
Array.from(this.state.images).forEach((image) => {
formData.append("files", image);
});
axios
.post(`https://****.com/uploadfiles/`, formData, {
headers: {
"Content-Type": "multipart/form-data",
},
})
感谢大家对这项工作的帮助。当我发现改进时,我会更新它:)