Jak skopiować obiekt InMemoryUploadedFile na dysk
Próbuję złapać plik wysłany za pomocą formularza i wykonać na nim kilka operacji, zanim zostanie zapisany. Więc muszę utworzyć kopię tego pliku w katalogu temp, ale nie wiem, jak do niego dotrzeć. Funkcje shutila nie kopiują tego pliku, ponieważ nie ma do niego ścieżki. Czy jest jakiś sposób na przeprowadzenie tej operacji w inny sposób ?
Mój kod:
image = form.cleaned_data['image']
temp = os.path.join(settings.PROJECT_PATH, 'tmp')
sourceFile = image.name # without .name here it wasn't working either
import shutil
shutil.copy(sourceFile, temp)
Co podnosi:
Exception Type: IOError at /
Exception Value: (2, 'No such file or directory')
I debugowanie:
# (..)\views.py in function
67. sourceFile = image.name
68. import shutil
69. shutil.copy2(sourceFile, temp) ...
# (..)\Python26\lib\shutil.py in copy2
92. """Copy data and all stat info ("cp -p src dst").
93.
94. The destination may be a directory.
95.
96. """
97. if os.path.isdir(dst):
98. dst = os.path.join(dst, os.path.basename(src))
99. copyfile(src, dst) ...
100. copystat(src, dst)
101.
▼ Local vars
Variable Value
dst
u'(..)\\tmp\\myfile.JPG'
src
u'myfile.JPG'
# (..)\Python26\lib\shutil.py in copyfile
45. """Copy data from src to dst"""
46. if _samefile(src, dst):
47. raise Error, "`%s` and `%s` are the same file" % (src, dst)
48.
49. fsrc = None
50. fdst = None
51. try:
52. fsrc = open(src, 'rb') ...
53. fdst = open(dst, 'wb')
54. copyfileobj(fsrc, fdst)
55. finally:
56. if fdst:
57. fdst.close()
58. if fsrc:
▼ Local vars
Variable Value
dst
u'(..)\\tmp\\myfile.JPG'
fdst
None
fsrc
None
src
u'myfile.JPG'
4 answers
To {[3] } jest podobne pytanie, może pomóc.
import os
from django.core.files.storage import default_storage
from django.core.files.base import ContentFile
from django.conf import settings
data = request.FILES['image'] # or self.files['image'] in your form
path = default_storage.save('tmp/somename.mp3', ContentFile(data.read()))
tmp_file = os.path.join(settings.MEDIA_ROOT, path)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:18
Jak wspomniano przez @ ups , podczas przesyłania dużych plików nie chcesz zapychać pamięci systemowej za pomocą data.read()
.
From Django docs :
Zapętlenie
UploadedFile.chunks()
zamiast użyciaread()
zapewnia że duże pliki nie przytłaczają pamięci systemu
from django.core.files.storage import default_storage
filename = "whatever.xyz" # received file name
file_obj = request.data['file']
with default_storage.open('tmp/'+filename, 'wb+') as destination:
for chunk in file_obj.chunks():
destination.write(chunk)
To zapisze plik w MEDIA_ROOT/tmp/
Jako twój default_storage
, chyba że powiedziano inaczej.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:47
Najlepszym sposobem działania jest napisanie niestandardowego programu obsługi wysyłania. Zobacz docs . Jeśli dodasz funkcję obsługi "file_complete", możesz uzyskać dostęp do zawartości pliku bez względu na plik pamięci lub plik ścieżki tymczasowej. Możesz również użyć metody "receive_data_chunck" i zapisać w niej swoją kopię.
Pozdrawiam
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-13 16:50:30
Oto inny sposób na zrobienie tego z Pythona mkstemp
:
### get the inmemory file
data = request.FILES.get('file') # get the file from the curl
### write the data to a temp file
tup = tempfile.mkstemp() # make a tmp file
f = os.fdopen(tup[0], 'w') # open the tmp file for writing
f.write(data.read()) # write the tmp file
f.close()
### return the path of the file
filepath = tup[1] # get the filepath
return filepath
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-19 23:02:52