Python 为什么我会得到;FileNotFoundError";使用Django进行文件上载时?

Python 为什么我会得到;FileNotFoundError";使用Django进行文件上载时?,python,django,django-file-upload,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 = reques

我正在用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>
我在控制台里有这个信息

FORM VALID
f:48.png
/17/3/48.png
(/17/3是前缀)

在回溯中,在浏览器的“本地变量”下,我有以下内容:

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/'>
pref'/17/3'
mylist[]
F
主键'17'
形式
要求
我想这告诉我内存中有一个48.png文件,为什么我打开它时它不在那里呢


非常感谢您的关注。

它只存在于内存中,而不在实际的文件系统中。Django文件对象为实际文件和内存文件提供了一个包装器

例如,如果您正在处理来自某个模型上的文件字段的文件,那么您所做的工作可以正常工作,但是您正在处理的文件在系统上还不存在

如果要在视图中读取文件,可以调用:

默认情况下,如果上载的文件小于2.5 MB,则Django 将在内存中保存上载的全部内容。这意味着 保存文件只需要从内存读取和写入磁盘 因此速度非常快

我把f.open(改为f.read)改成了f.read(现在它工作得很好)。为了完整性:我的目标是将上传的文件存储在S3中,所以现在我这样做了

s3.Object('mybucket', str(pk)+'/'+str(p)+'/'+str(f)).put(Body=f.read(),Metadata={'project': '17','dataset':'3','filename':str(f)})
这是有效的

f = request.FILES['thefile']
contents = f.read()
s3.Object('mybucket', str(pk)+'/'+str(p)+'/'+str(f)).put(Body=f.read(),Metadata={'project': '17','dataset':'3','filename':str(f)})