Comment faire pour copier InMemoryUploadedFile objet sur le disque
Je suis en train d'essayer d'attraper un fichier envoyé avec le formulaire et effectuer des opérations, avant d'être sauvé. J'ai donc besoin de créer une copie de ce fichier dans le répertoire temp, mais je ne sais pas comment l'atteindre. Shutil fonctions ne parviennent pas à copier ce fichier, car il n'y a pas de chemin vers elle. Donc, il y a un moyen de faire cette opération dans une autre façon ?
Mon code :
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)
Qui soulève :
Exception Type: IOError at /
Exception Value: (2, 'No such file or directory')
Et le debug :
# (..)\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'
Vous devez vous connecter pour publier un commentaire.
Cette est la même question, ça pourrait aider.
FileField(upload_to='data-files-dir').generate_filename(None, data.name)
Comme mentionné par @ups, lors de l'envoi de fichiers volumineux, vous ne voulez pas obstruer le système de mémoire avec une
data.read()
.De Django docs :
Cela permettra d'enregistrer le fichier à
MEDIA_ROOT/tmp/
que votredefault_storage
aura moins d'avis contraire.Votre meilleur plan d'action est d'écrire une coutume Télécharger gestionnaire. Voir la docs . Si vous ajoutez un "file_complete" handler, vous pouvez accéder au contenu du fichier, peu importe d'avoir un fichier de la mémoire ou un chemin d'accès temporaire de fichier. Vous pouvez également utiliser la fonction "receive_data_chunck" méthode et d'écrire votre copie en son sein.
Ce qui concerne
Voici une autre façon de le faire avec python
mkstemp
: