如何通过Axios将Node.js端PDF文件发送到Flask服务端并正确解析
问题根因
你在Node.js侧构造formData追加文件时,没有给Buffer类型的文件内容指定文件名参数,form-data库默认会将其识别为普通文本字段而非文件字段,因此Flask不会将其归入request.files,而是放到普通表单参数request.form中。
方案1:修改Node.js侧代码(推荐)
在formData.append方法中传入第三个参数指定文件名,符合form-data文件传输的标准规范,修改后的Node.js代码如下:
const existingFile = fs.readFileSync(path) console.log(existingFile) const formData = new nodeFormData() // 追加第三个参数指定文件名,标记为文件字段 formData.append("file", existingFile, { filename: documentData.docuName }) formData.append("fileName", documentData.docuName) try { const getFile = await axios.post("http://127.0.0.1:5000/pdf-slicer", formData, { headers: { ...formData.getHeaders() } }) console.log(getFile)} catch (e) {console.log(e, "getFileError")}
修改后Flask侧可以直接从request.files中拿到标准文件对象,示例代码如下:
if request.method == "POST": file = request.files.get("file") if file: # 直接保存到本地 file.save("./target.pdf") # 也可以直接读取字节内容 content = file.read()
方案2:直接处理现有request.form中的数据
如果不需要调整Node.js侧代码,可以直接将拿到的字符串格式的文件内容转换为Python可用的类文件对象,操作代码如下:
from io import BytesIO if request.method == "POST": file_content_str = request.form.get("file") if file_content_str: # 用latin-1编码转换为原始字节,避免二进制内容丢失 file_bytes = file_content_str.encode("latin-1") # 封装为类文件对象,可直接传入PDF处理库、或写入本地 file_obj = BytesIO(file_bytes) # 示例:保存到本地 with open("./target.pdf", "wb") as f: f.write(file_bytes)
注意:必须使用
latin-1编码,该编码为单字节编码,所有二进制字节值都可以直接映射为对应字符,不会出现内容丢失或编码错误。
内容的提问来源于stack exchange,提问作者Mirza Umair
相关产品推荐
相关产品推荐

