zxlrj 2024-03-30 00:23 采纳率: 0%
浏览 3

multipart/form-data

关于使用multipart/form-data;自定义boundary上传附件的问题
自定义
Content-Disposition: form-data; name="file"; filename="007_.docx"
Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document

然后下边是二进制读取的文件内容,当读取文本文件时候没问题,读取docx文件的时候会出错。提示500错误。请问怎么处理才能正常上传?

又试了试,传送非汉字字符串可以没问题,有汉字就不行。

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-03-30 00:23
    关注

    引自免费微信小程序:皆我百晓生

    在解决Multipart/form-data上传附件的问题时,我们需要遵循几个关键步骤,以确保正确的格式、大小限制以及在上传过程中进行验证和安全处理。以下是一个详细的解决方案示例,包括使用Python的requests库处理POST请求,并在接收来自客户端的附件数据后,对其进行预处理以处理异步读取文档并将其转换为XML。

    首先,确保您已经安装了必要的库:

    pip install requests xml.etree.ElementTree
    
    1. 通过open()函数打开包含要上传的二进制文件的文件(在这个例子中,我们使用"007_.docx"作为文件名),并将其赋值给一个变量input_file
    with open('007_.docx', 'rb') as file:
        input_file = file.read()
    
    1. 使用binascii.unhexlify()函数将二进制数据转换为字符串,以便于后续的编码解码操作。我们将这个字符串存储在变量binary_data中:
    binary_data = binascii.unhexlify(input_file)
    
    1. binary_data分割成列表以准备将其传递到HTML表单提交或用于读取字节流。
    part_bodies = binary_data.split(b';')
    
    1. 创建一个字符串用于创建Multipart/form-data表单,其中包含两个字段:一个名为'name'的名称域(可选)和一个名为'docx'的类型域。这将引导服务器解析响应并将它们附加到指定的表单数据中。
    multipart_form_data = MultipartFormData()
    multipart_form_data.add_field('name', 'File Upload', FileDataSource(binary_data))
    multipart_form_data.add_field('docx', MIMEApplication('application/vnd.openxmlformats-officedocument.wordprocessingml.document'), FileDataSource(input_file))
    
    1. 在上述代码中,MIMEApplication('application/vnd.openxmlformats-officedocument.wordprocessingml.document')指定了上传的文件类型是Word文档,这是常见的接受的输入类型。根据实际需求,可能需要选择不同的应用程序类型。

    2. 通过post()方法向指定URL发送POST请求,设置请求头,包括Multipart/form-data选项和Content-Disposition属性。在这里,我们将使用'filename="007_.docx"'指定上传文件名,由于我们已经有了已知的文件名,所以无需手动指定文件的实际路径。

    response = requests.post(url, files=multipart_form_data)
    
    1. 解析POST请求响应并获取HTTP状态码和Content-Type信息。
    response.status_code
    response.content_type
    
    1. 遍历HTTP响应体,检查是否有任何特殊的元数据以指示文件是否成功上传。如果有,我们可以在解析文档之前添加相应的预处理逻辑(例如,将字节流转换为字典以处理语法和拼写错误)。
    if response.status_code == 200:
        # 处理上传成功的状态码
        doc_xml = ElementTree.fromstring(response.content)
        
        # 检查文档格式
        if 'wpsDocument' in doc_xml.attrib and 'wordprocessingml' in doc_xml.attrib['wpsDocument']:
            # 这里,我们可以进一步处理Word文档结构和内容,例如读取行数、检查字体样式等
            tree = ElementTree.parse(doc_xml)
            print(tree.getroot())
        else:
            print(f'Failed to parse Word document: {doc_xml}')
    else:
        print(f'Failed to upload file: {response.status_code}')
    
    1. 如果文件成功上传,执行所需的操作,例如保存或导出文档。这里,我们可以使用Python的open()函数打开文件,并使用to_html()方法将其转换为可读的HTML文档,同时保持所需的嵌套结构:
    with open('document.html', 'wb') as f:
        f.write(tree.to_html())
    
    1. 对接HTML文件并在浏览器中查看文件内容,如果一切顺利,文档应与预期相符。

    以上就是使用Python处理Multipart/form-data上传附件的基本步骤。请注意,这只是一个基本的示例,实际应用可能需要根据具体的需求和规范进行调整。例如,对于非Windows环境,可能需要在发送POST请求前使用os.nameos.path.basename()判断操作系统类型,并相应地更改文件路径。另外,考虑到安全因素,可能会对上传文件进行权限检查或加密,特别是在处理敏感数据或传输复杂的二进制文件时。如果需要更深入的安全控制,可以考虑使用像Flask-Security这样的框架进行安全处理。在此方案中,Flask-Security允许配置身份验证策略、验证令牌存储、访问控制等功能,从而保护上传文件的端点免受未经授权的访问和恶意攻击。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 4月1日
  • 创建了问题 3月30日