51 votes

Comment copier l'objet InMemoryUploadedFile sur le disque

J'essaie de récupérer un fichier envoyé avec le formulaire et d'effectuer certaines opérations dessus avant qu'il ne soit enregistré. Je dois donc créer une copie de ce fichier dans le répertoire temporaire, mais je ne sais pas comment l'atteindre. Les fonctions de Shutil ne parviennent pas à copier ce fichier, car il n'y a pas de chemin vers celui-ci. Existe-t-il donc un moyen de faire cette opération d'une autre manière ?

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)

Ce qui soulève :

Exception Type: IOError at /

Et le debug :

 

69voto

Davor Lucic Points 11072

C'est une question similaire, ça peut aider.

 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)

8voto

David542 Points 7882

Voici une autre façon de le faire avec les mkstemp python :

 ### 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

5voto

Arthur Debert Points 3632

Votre meilleur plan d'action est d'écrire un gestionnaire de téléchargement personnalisé. Voir la doc . Si vous ajoutez un gestionnaire "file_complete", vous pouvez accéder au contenu du fichier indépendamment du fait d'avoir un fichier mémoire ou un fichier de chemin temporaire. Vous pouvez également utiliser la méthode "receive_data_chunck" et y écrire votre copie.

Salutations

4voto

Prasad Points 316

Voici comment j'ai essayé de sauvegarder le fichier localement

     file_object = request.FILES["document_file"]
    file_name = str(file_object)
    print(f'[INFO] File Name: {file_name}')
    with open(file_name, 'wb+') as f:
        for chunk in file_object.chunks():
            f.write(chunk)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X