为什么我会得到" FileNotFoundError"什么时候用Django做文件上传?

时间:2016-02-10 18:58:05

标签: python django django-file-upload

我正在用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。那么为什么我打开它时不存在呢?

非常感谢你的关注。

3 个答案:

答案 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)})

这可行。