Файл загрузки Django в определенный каталог, который зависит от URI POST

Я хотел бы хранить загруженные файлы в определенный каталог, который зависит от URI запроса POST. Возможно, я также хотел бы переименовать файл к чему-то зафиксированному (название входа файла, например), таким образом, у меня есть простой способ к grep файловая система, и т.д. и также избегать возможных проблем безопасности.

Что предпочтительный путь состоит в том, чтобы сделать это в Django?

Править: Я должен разъяснить, что интересовался бы возможным выполнением этого как обработчик загрузок файла, чтобы не писать большой файл дважды в файловую систему.

Edit2: Я предполагаю, что каждый может просто 'mv' tmp файл к новому местоположению. Это - дешевая операция если в той же файловой системе.

9
задан kmt 17 February 2010 в 01:51
поделиться

1 ответ

Django дает вам полный контроль над тем, где (и если) сохранять файлы. См .: http://docs.djangoproject.com/en/dev/topics/http/file-uploads/

В приведенном ниже примере показано, как объединить URL-адрес и имя загруженного файла и записать файл. на диск:

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()

Изменить: Как это сделать с помощью FileUploadHandler? Он прослежен по коду, и кажется, что вам нужно сделать четыре вещи, чтобы перепрофилировать TemporaryFileUploadHandler для сохранения за пределами FILE_UPLOAD_TEMP_DIR:

  1. расширить TemporaryUploadedFile и переопределить init () для передачи через другой каталог в NamedTemporaryFile. Он может использовать команду try mkdir, за исключением прохода, который я показал выше.

  2. расширить TemporaryFileUploadHandler и переопределить new_file () для использования вышеуказанного класса.

  3. также расширяют init (), чтобы принять каталог, в который вы хотите поместить папку.

  4. Динамически добавить обработчик запросов, проходя через каталог, определенный по URL:

    request.upload_handlers = [ProgressBarUploadHandler (request.path.replace ('/', '_')]

Хотя нетривиально , это по-прежнему проще, чем писать обработчик с нуля: в частности, вам не придется писать ни одной строки подверженного ошибкам буферизованного чтения. Шаги 3 и 4 необходимы, потому что FileUploadHandler не передает информацию запроса по умолчанию, я считаю, поэтому вам придется указать это отдельно, если вы хотите каким-то образом использовать URL-адрес.

Я не могу рекомендовать для этого написать собственный FileUploadHandler. Это действительно смешение уровней ответственности. По сравнению со скоростью загрузки файла через Интернет, локальное копирование файла несущественно. А если файл небольшой, Django просто сохранит его в памяти, не записывая во временный файл. У меня плохое предчувствие, что вы все это заработаете и обнаружите, что даже не можете измерить разницу в производительности.

4
ответ дан 4 December 2019 в 15:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: