2009-05-12 10 views
15

im teniendo problemas en subir varios archivos con el mismo nombre de entrada:múltiples archivos de carga usando el mismo nombre de la entrada en Django

<input type=file name="file"> 
<input type=file name="file"> 
<input type=file name="file"> 

al lado Django

print request.FILES : 

<MultiValueDict: {u'file': [ 
<TemporaryUploadedFile: captcha_bg.jpg (image/jpeg)>, 
<TemporaryUploadedFile: 001_using_git_with_django.mov (video/quicktime)>, 
<TemporaryUploadedFile: ejabberd-ust.odt (application/vnd.oasis.opendocument.text)> 
]}> 

así los tres archivos están bajo petición individual. ARCHIVO ['archivo'] objeto. ¿Cómo manejo cada archivo cargado desde aquí?

+0

mismo problema y la solución de un solo elemento con múltiples: ' ' – Mark

Respuesta

49
for f in request.FILES.getlist('file'): 
    # do something with the file f... 

EDIT: Sé que esto era una respuesta de edad, pero me encontré con que en este momento y he editado la respuesta a la realidad puede ser correcta. Anteriormente sugería que podía iterar directamente sobre request.FILES['file']. Para acceder a todos los elementos en un MultiValueDict, use .getlist('file'). El uso de solo ['file'] solo devolverá el último valor de datos que encuentre para esa clave.

+1

¿Alguna idea de por qué es que 'request.FILES ['file']' no funciona? Soy curioso. – Mark

+0

@Mark si quiere decir que no se cargó ningún archivo, devolverá una cadena o lista vacía, pero si quiere decir que lo va a cargar, pero todavía no puede obtener el archivo de 'request.FILES ['file']' s es lo más probable es que te faltan campos necesarios en el campo 'entrada' en tu código html. Según mi experiencia, necesitas usar 'name =" myfile "' en el 'campo de entrada' para hacerlo específico. En este caso, debe usar 'request.FILES ['myfile']'. Usar 'file' como nombre en el código html hace que sea realmente difícil distinguir qué es qué. – Ibo

+0

Una cosa más que es importante cuando se trata de múltiples archivos es incluir la etiqueta "multiple/form-data in html' form' para que su etiqueta de formulario que envuelve su etiqueta 'input' sea'

' – Ibo

1

No creo que los tres archivos estén bajo el único objeto request.FILES['file']. request.FILES['file'] es probable que tenga el primer archivo o el último archivo de esa lista.

Es necesario nombrar de forma única los elementos de entrada, así:

<input type=file name="file1"> 
<input type=file name="file2"> 
<input type=file name="file3"> 

..for ejemplo.

EDITAR: Justin's answer es mejor!

+0

Django maneja automáticamente el caso donde múltiples entradas tienen el mismo nombre: entrega a su código una lista de valores en lugar de un solo valor. Puede ver la lista en el código que se publicó. –

+0

Entonces, este 'MultiValueDict' es el resultado de tal vez un contenedor de la solicitud. ¿Objeto FILES ['file'] entonces? –

+0

Sí, request.FILES es un objeto MultiValueDict, mientras que request.GET y request.POST son objetos QueryDict, que son similares. –

7

Teniendo en cuenta sus puntos de URL a envia se podía soportar varios archivos como esto:

#!/usr/bin/env python 
# -*- coding: UTF-8 -*- 
from django.http import HttpResponseRedirect 

def envia(request): 
    for f in request.FILES.getlist('file'): 
     handle_uploaded_file(f) 
    return HttpResponseRedirect('/bulk/') 

def handle_uploaded_file(f): 
    destination = open('/tmp/upload/%s'%f.name, 'wb+') 
    for chunk in f.chunks(): 
     destination.write(chunk) 
    destination.close() 
+0

No debe usar el nombre de archivo proporcionado por el usuario para escribir en el disco, puede manipularse para escribir en cualquier lugar. Utilice un nombre de archivo aleatorio y almacene el nombre de archivo original en la base de datos solo para fines de presentación –

Cuestiones relacionadas