Django le da control total sobre dónde (y si) guarda los archivos. Ver: http://docs.djangoproject.com/en/dev/topics/http/file-uploads/
El siguiente ejemplo muestra cómo combinar la URL y el nombre del archivo subido y escribir el archivo al disco:
def upload(request):
folder = request.path.replace("/", "_")
uploaded_filename = request.FILES['file'].name
# create the folder if it doesn't exist.
try:
os.mkdir(os.path.join(BASE_PATH, folder))
except:
pass
# save the uploaded file inside that folder.
full_filename = os.path.join(BASE_PATH, folder, uploaded_filename)
fout = open(full_filename, 'wb+')
# Iterate through the chunks.
for chunk in fout.chunks():
fout.write(chunk)
fout.close()
Editar: Cómo hacer esto con un FileUploadHandler? Se trazó hacia abajo a través del código y parece que tiene que hacer cuatro cosas para cambiar la finalidad de la TemporaryFileUploadHandler para guardar fuera del FILE_UPLOAD_TEMP_DIR:
extender TemporaryUploadedFile y anular init() para pasar a través de un directorio diferente a NamedTemporaryFile . Puede usar el try mkdir a excepción del pase que mostré arriba.
extienden TemporaryFileUploadHandler y reemplazan new_file() para utilizar la clase anterior.
también extienden init() para aceptar el directorio donde desea que vaya la carpeta.
agregar dinámicamente el controlador de solicitudes, pasando a través de un directorio determinado a partir de la URL:
request.upload_handlers = [ProgressBarUploadHandler (request.path.replace ('/', '_')]
Aunque no es trivial, es aún más fácil que escribir un controlador desde cero: en particular, no tendrá que escribir una sola línea de lectura en búfer propensa a errores. Los pasos 3 y 4 son necesarios porque no se transfieren FileUploadHandlers información por defecto, creo, por lo que tendrá que decirlo por separado si desea utilizar la URL de alguna manera.
No puedo recomendar escribir un FileUploadHandler personalizado para esto. Realmente está mezclando capas de responsabilidad. En relación con la velocidad de carga de un archivo a través de Internet, hacer una copia de archivo local es insignificante. Y si el archivo es pequeño, Django lo mantendrá en la memoria sin escribirlo en un archivo temporal. Tengo la mala sensación de que conseguirás que todo esto funcione y descubras que ni siquiera puedes medir la diferencia de rendimiento.
moviendo el archivo temporal está bien.Django comprueba este caso y no se queja si se pierde: http://code.djangoproject.com/browser/django/trunk/django/core/files/uploadedfile.py#L57 – olooney