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())
这给了我:
现在我已经用两个不同的 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())
使用文本文件可以进行通常的下载或保存,但文本文件只是相同的字节字符串,而不是实际的文件。
我花了最后一天的时间试图找到准确的单词组合,以使谷歌给我答案,但是在(非常少,令人惊讶的)完全适用的结果中,它们都表现得好像这样是一个基本操作,应该可以工作。我发现有关从二进制文件读取并正确打开它们的内容,但上传的文件是临时文件,而不是保存的文件,它位于内存中,并且 open 不是它的有效方法。我还看到过有关在 python 中设置文件服务器的内容,但他们谈论的是设置实际的服务器,而不仅仅是吐出单个文件。我需要设置一个完整的服务器来取回文件吗?
我确信我在这里犯了一些极其愚蠢的菜鸟错误,但我就是不知道是什么。
最佳答案
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())
关于python - 获取字节对象而不是上传的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13160139/