Почему я получаю "FileNotFoundError" при загрузке файла с Django?

Я пишу страницу загрузки файла с 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')

Вещи идут не так в открытом (заявление 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 ответа

По умолчанию, если загруженный файл меньше 2,5 мегабайт, Django будет хранить все содержимое загрузки в памяти. Это означает, что сохранение файла включает только чтение из памяти и запись на диск и, следовательно, очень быстро.

Я изменил 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)})

и это работает.

Это только там, в памяти, а не на реальной файловой системе. Объекты Django File предоставляют оболочку как для реальных файлов, так и для файлов в памяти.

Например, если вы обрабатывали файл, который поступал из FileField на некоторой модели, то то, что вы делаете, сработало бы, но файл, с которым вы работаете, еще не существует в системе.

Если вы хотите прочитать файл в своем представлении, вы можете просто вызвать File.read:

f = request.FILES['thefile']
contents = f.read()
Другие вопросы по тегам