Почему я получаю "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()