我正在用Django / Python编写文件上传页面。我收到此错误: FileNotFoundError:[Errno 2]没有这样的文件或目录:' 48.png'。
以下是视图的相关部分,用于处理上传:
`if request.method == 'POST':
form = myform(request.POST, request.FILES)
if form.is_valid():
print("FORM VALID")
f = request.FILES['thefile']
print("f:" + f.name)
print(pref+'/'+str(f))
open(f.name, 'rb')
else:
print('FORM NOT VALID')
open中出错(f.name语句。表单在模板中:
<form method="post" action="/dataset_storage_upload/{{ pk }}/{{pid}}/" name="submit" enctype="multipart/form-data">
{% csrf_token %}
{{ theForm.as_p }}
<button type="start_upload" value="Submit" onclick="document.upload.submit() ">Upload</button>
</form>
这是表格:
class myform(forms.Form):
thefile = forms.FileField()
我在控制台中有这些信息
FORM VALID
f:48.png
/17/3/48.png
(/ 17/3是前缀)
在Traceback中,在浏览器中,在本地变量下,我有:
pref '/17/3'
mylist[]
f <InMemoryUploadedFile: 48.png (image/png)>
pk '17'
form <myform bound=True, valid=True, fields=(thefile)>
request<WSGIRequest: POST '/dataset_storage_upload/17/3/'>
我认为这告诉我内存中有一个文件48.png。那么为什么我打开它时不存在呢?
非常感谢你的关注。
答案 0 :(得分:0)
它只存在于内存中,而不是实际的文件系统上。 Django File对象提供了真实文件和内存文件的包装。
例如,如果您正在某个模型上处理来自FileField的文件,那么您正在执行的操作将起作用,但您正在处理的文件尚不存在于系统中。
如果您想在视图中阅读该文件,只需拨打File.read:
即可f = request.FILES['thefile']
contents = f.read()
答案 1 :(得分:0)
默认情况下,如果上传的文件小于2.5兆字节,则为Django 将上传的全部内容保存在内存中。这意味着 保存文件只涉及从内存中读取和写入磁盘 因此非常快。
答案 2 :(得分:0)
我改变了f.open(进入f.read(现在它完美无缺。完整性:我的目标是将上传的文件存储在S3中,所以现在我做了
s3.Object('mybucket', str(pk)+'/'+str(p)+'/'+str(f)).put(Body=f.read(),Metadata={'project': '17','dataset':'3','filename':str(f)})
这可行。