获取字节对象而不是上传文件

时间:2012-10-31 14:23:21

标签: python file-upload python-3.x bytesio

Python 3.2,Apache,没有框架

我有一个表单来上传文件:

<form action="Files/Admin/Upload" method="post" enctype="multipart/form-data">
    <input type="file" name="upload_file" style="width:100%">
    <input type="submit" class="button" value="Upload">
</form>

还有一些选择框,但我不想混淆这个问题。最终目标是加密给定文件,并将其存储在某个地方,然后稍后将其解密并返回。我设法让加密/解密工作,但不是pdf文件,我最终得到一个字节字符串(在浏览器中打开它说:

b'%PDF-1.4 %âãÏÓ <snip...>

所以我删除了加密和解密并保存,现在我只是想让它回复我刚上传的确切文件:

import cgi
tmp = cgi.FieldStorage()
dat = tmp['upload_file']
import mimetypes
gtype,encoding = mimetypes.guess_type(dat.filename)
print ('Content-type:', gtype+'\n')
print (dat.file.read())

这让我:

Adobe Error

我现在用两种不同的pdf尝试过,两者都给出了同样的信息。

文本文件返回原始文本的字节字符串:

b'STUFF - \xa7112.7\r\n1\r\nSTUFF\r\n8\r\nSTUFF <snip...>

更改代码以包含处置:

import cgi
tmp = cgi.FieldStorage()
dat = tmp['upload_file']
import mimetypes
gtype,encoding = mimetypes.guess_type(dat.filename)
print ('Content-type:', gtype)
print ('Content-Disposition: attachment; filename="'+dat.filename+'"\n')
print (dat.file.read())

并使用文本文件给我通常的下载或保存,但文本文件只是相同的字节字符串,而不是实际的文件。

我花了最后一天试图找到能让谷歌给我答案的确切正确的单词组合,但是(很少,令人惊讶的)结果完全适用,它们都表现得好像这样是一个基本的操作,应该只是工作。我找到的东西谈论从二进制文件读取并正确打开它们,除了上传的文件是临时文件,而不是保存的文件,它在内存中并且打开不是一个有效的方法。我也看过在python中设置文件服务器的东西,但是他们谈论的是设置实际的服务器,而不仅仅是吐出一个文件。我是否需要设置一个完整的服务器来获取文件?

我确定我在这里犯了一些令人难以置信的愚蠢新手错误,但我无法弄清楚是什么。

1 个答案:

答案 0 :(得分:3)

print总是包含一个额外的换行符,它会破坏二进制PDF文件。传递end=参数或写入sys.stdout

#!/usr/bin/env python3
import sys
import cgi
tmp = cgi.FieldStorage()
dat = tmp['upload_file']
import mimetypes
gtype,encoding = mimetypes.guess_type(dat.filename)

sys.stdout.buffer.write (b'Content-type:' + gtype.encode('ascii') + b'\r\n\r\n')
sys.stdout.buffer.write (dat.file.read())