Solución:
Cuando se carga un archivo, Django hará una de estas dos cosas: almacenarlo en la memoria si el archivo es pequeño (<2 MB la última vez que lo verifiqué), o almacenarlo como un archivo temporal en el disco si es grande. Este comportamiento se puede configurar a través del FILE_UPLOAD_HANDLERS
configuración. Por lo tanto, su servidor web y Django se encargan de la carga y el almacenamiento reales, pero es su trabajo procesar el archivo antes de que finalice la solicitud; de lo contrario, el archivo se elimina.
Los archivos cargados son accesibles a través del request.FILES
propiedad. Cada clave en FILES
coincidirá con el nombre de la entrada del archivo en su <form>
. El valor es un UploadedFile
objeto, que es una secuencia que puede utilizar para leer los datos del archivo.
Por ejemplo, digamos que tiene un <input name="img" type="file" />
y desea detectar si la imagen es completamente blanca. No necesita almacenar el archivo para esto, solo necesita cargarlo en la memoria, procesarlo para obtener el resultado y luego dejar que se descarte.
from PIL import Image
def some_view(request):
if request.method == 'POST':
img_file = request.FILES['img']
if img_file.size > 2000000:
return HttpResponseBadRequest()
img = Image.open(img_file)
# analyze the image...
Otra posibilidad es que alguien esté cargando un archivo de respaldo que es bastante grande (digamos 2 GB) y usted necesita almacenarlo en algún lugar. Efectivamente, es lo mismo, excepto que leemos el archivo en la memoria en fragmentos, luego escribimos cada fragmento en el disco en otro lugar para que se guarde después de que finalice la solicitud.
def some_view(request):
if request.method == 'POST':
backup_file = request.FILES['backup_file']
with open('some/file/name.bak', 'wb+') as destination:
for chunk in backup_file.chunks():
destination.write(chunk)
# file is saved
Cuando finaliza la solicitud, el archivo cargado se almacena en some/file/name.bak
.
Ya sea en la memoria o en un archivo temporal, generalmente no es importante porque la interfaz es la misma. Puede leer un archivo temporal del mismo modo que puede leer un archivo en memoria.
Puede establecer qué controlador de carga se usa para un formulario de Django: https://docs.djangoproject.com/en/1.11/ref/files/uploads/#module-django.core.files.uploadhandler
Hay dos opciones integradas:
- en memoria
- archivo temporal
La forma en que Django parece funcionar es recorriendo la lista de todos los controladores de carga: https://docs.djangoproject.com/en/1.11/topics/http/file-uploads/#upload-handlers
Para cada controlador de carga, verificará una condición específica y, si esa condición es verdadera, activará y usará ese controlador de carga.
InMemoryUploadHandler, por ejemplo, se activa y se utiliza cuando los archivos tienen un tamaño inferior a un determinado. TemporaryFileUploadHandler se utiliza cuando los archivos son muy grandes.
Podrá acceder a los datos y archivos desde el request
objeto.