Comment puis-je obtenir le nom de fichier à partir de request.FILES dans Django?
def upload(request):
if request.method == 'POST':
form = UploadForm(request.POST, request.FILES)
if form.is_valid():
upload = Upload()
upload.timestamp = datetime.datetime.now()
save_instance(form, upload)
J'ai essayé d'utiliser ceci mais cela n'a pas fonctionné:
if 'filename' in request.FILES:
filename = request.FILES['filename']
request.FILES['filename'].name
De la documentation request
.
Si vous ne connaissez pas la clé, vous pouvez parcourir les fichiers:
for filename, file in request.FILES.iteritems():
name = request.FILES[filename].name
file = request.FILES['filename']
file.name # Gives name
file.content_type # Gives Content type text/html etc
file.size # Gives file's size in byte
file.read() # Reads file
REMARQUE si vous utilisez python 3.x:
request.FILES
est un objet de type dictionnaire à valeurs multiples qui conserve les fichiers téléchargés via un bouton de téléchargement de fichier. Dites dans votre code html que le nom du bouton (type = "fichier") est "monfichier" donc "monfichier" sera la clé de ce dictionnaire. Si vous avez téléchargé un fichier, la valeur de cette clé sera un seul et si vous avez téléchargé plusieurs fichiers, vous aurez plusieurs valeurs pour cette clé spécifique. Si tu utilises request.FILES['myfile']
vous obtiendrez la première ou la dernière valeur (je ne peux pas le dire avec certitude). C'est très bien si vous n'avez téléchargé qu'un seul fichier, mais si vous voulez obtenir tous les fichiers, vous devez le faire:
list=[] #myfile is the key of a multi value dictionary, values are the uploaded files
for f in request.FILES.getlist('myfile'): #myfile is the name of your html file button
filename = f.name
list.append(filename)
bien sûr, on peut presser le tout sur une seule ligne, mais c'est facile à comprendre
La réponse peut être obsolète, car il existe une propriété name
dans la classe UploadedFile
. Voir: Fichiers téléchargés et gestionnaires de téléchargement (documentation Django) . Donc, si vous liez correctement votre formulaire avec un FileField
, l'accès devrait être aussi simple que:
if form.is_valid():
form.cleaned_data['my_file'].name