我有两种编写二进制文件的方法:第一种方法 由与文件上载相对应的服务器接收的数据(即,处理其enctype =“multipart / form-data”的表单),第二个与作为电子邮件附件发送的文件数据一起工作(即,通过解析电子邮件消息获得的文件数据)消息体使用get_payload())。
奇怪的是,它们不可互换:如果我使用第一个来保存从电子邮件附件解析的数据,它就会失败;同样,第二个函数在处理上传的文件数据时失败。
有哪些重要区别?
这是第一种方法:
def write_binary_file (folder, filename, f, chunk_size=4096):
"""Write the file data f to the folder and filename combination"""
result = False
if confirm_folder(folder):
try:
file_obj = open(os.path.join(folder, file_base_name(filename)), 'wb', chunk_size)
for file_chunk in read_buffer(f, chunk_size):
file_obj.write(file_chunk)
file_obj.close()
result = True
except (IOError):
print "file_utils.write_binary_file: could not write '%s' to '%s'" % (file_base_name(filename), folder)
return result
这是第二种方法:
def write_binary_file (folder, filename, filedata):
"""Write the binary file data to the folder and filename combination"""
result = False
if confirm_folder(folder):
try:
file_obj = open(os.path.join(folder, file_base_name(filename)), 'wb')
file_obj.write(filedata)
file_obj.close()
result = True
except (IOError):
print "file_utils.write_binary_file: could not write '%s' to '%s'" % (file_base_name(filename), folder)
return result
答案 0 :(得分:2)
区别在于HTTP上传方法(第一个) - 作为参数接收类文件对象本身(“f”变量)并创建一个特定于CGI模块的“read_buffer”来读取块中的数据file对象将它们复制到实际文件中。
Thsi在http上传应用程序中有意义,因为它允许文件副本在上传时启动 - 我不认为这很重要但是对于上传几兆字节的情况,因为你的http响应将停止,直到所有上传完成,在一个简单的CGI脚本中。
另一种方法接收“file_data”作为参数:allit必须做的是将此数据写入新文件。 (另一个必须从类似文件的对象中读取数据,它仍然为此创建一个中间对象)
您可以使用第二种方法保存HTTP数据,只需传递它期望的对象类型作为参数,因此,不要使用CGI字段值提供的“f”arguemtn调用第二个函数,它带有“f.read()” - 这将导致所有数据从“f”文件中读取,如对象和方法可以看到的相应数据。
即:
#second case:
write_binary_file(folder, filename, f.read() )
答案 1 :(得分:1)
第一个可能期望一个类文件对象作为参数,从中读取数据。第二个期望该参数是一个字符串,其中包含要写入的实际数据。
确保您必须查看read_buffer
函数的功能。
答案 2 :(得分:0)
最明显的区别是数据的分块读取。您没有指定错误,但我猜测chunked方法在调用read_buffer
时失败。