如何修改pyCurl函数实现Base64字节串上传至WebDAV服务器?
基于pyCurl上传Base64编码字节串至WebDAV的修改方案
原问题背景
原有pyCurl函数用于从本地文件读取内容上传至WebDAV服务器,现需修改为上传存储在filedata变量中的Base64编码字节串,需调整READFUNCTION及文件大小相关代码。
修改后的完整函数
import pycurl import os import base64 import io def fileupload(url, filename, filedata, upload_user, upload_pw): # Initialize pycurl c = pycurl.Curl() url = url + filename c.setopt(pycurl.URL, url) c.setopt(pycurl.UPLOAD, 1) # 解码Base64字节串为原始文件字节数据 decoded_data = base64.b64decode(filedata) # 将字节数据包装为类文件流对象 data_stream = io.BytesIO(decoded_data) # 设置读取函数为流对象的read方法 c.setopt(pycurl.READFUNCTION, data_stream.read) c.setopt(pycurl.SSL_VERIFYPEER, 0) c.setopt(pycurl.SSL_VERIFYHOST, 0) c.setopt(pycurl.USERPWD, f"{upload_user}:{upload_pw}") # 设置上传数据的大小为解码后字节数据的长度 filesize = len(decoded_data) c.setopt(pycurl.INFILESIZE, filesize) # Start transfer c.perform() c.close()
关键修改点说明
- Base64解码:
filedata是Base64编码的字节串,必须先解码为原始文件的字节数据,否则服务器接收到的是编码后的无效内容。 - 类文件流适配:使用
io.BytesIO将内存中的字节数据包装成类文件对象,其read方法完全符合pycurl对READFUNCTION的要求——每次被调用时返回指定长度的字节,直到返回空串表示数据读取完毕。 - 文件大小计算:直接使用解码后字节数据的长度
len(decoded_data),替代原本地文件大小的读取逻辑,无需再访问本地文件系统。
内容的提问来源于stack exchange,提问作者nico
相关产品推荐
相关产品推荐

