Отображение содержания (вместо того, чтобы сохранить) загруженного файла с Django

Как у меня может быть форма с FileField, где загруженный файл не будет сохранен, но вместо этого его текстовое содержание будет извлечено и отображено?

5
задан Dominic Rodger 26 April 2010 в 13:38
поделиться

1 ответ

Документы: http://docs.djangoproject.com/en/dev/topics/http/file-uploads/

Краткая версия:

  1. Ваша форма загрузки должна иметь формы Поле .FileField .
  2. Когда форма отправлена, она переходит к URL-адресу, который ведет к функции просмотра, которую вы написали. Эта функция просмотра принимает HttpRequest (обычно называется запрос ).
  3. Получить файл из request.FILES [] .

Например, если ваша форма содержит:

upFile = forms.FileField

, тогда ваше представление может перейти к файлу с помощью:

def uploadView(request):
    upFile = request.FILES["upFile"]

где upFile - это объект UploadedFile , то есть ] не файловый объект. UploadedFile имеет следующие свойства:

  • имя : имя загруженного файла
  • размер : размер в байтах

и следующие методы:

  • чтение ( ) : прочитать весь файл и вернуть в виде строки. Возможно, подходит для вас, но не рекомендуется для файлов размером более 2,5 МБ.
  • multiple_chunks () : возвращает True , если файл должен обрабатываться как несколько фрагментов.
  • chunks () : возвращает генератор (используйте его как итератор), который возвращает данные файла по частям.

Итак, продолжая пример, если вы просто хотите сохранить файл на диск, вы можете написать:

outFile = open("/tmp/uploadTest.txt", "w")
if not upFile.multiple_chunks():
    outFile.write(upFile.read())
else:
    for chunk in upFile.chunks():
        outFile.write(chunk)
outFile.close()

В вашем случае вы, вероятно, могли бы просто показать сообщение об ошибке и удалить файл, если multiple_chunks () возвращает True , поскольку вы, вероятно, не хотите размещать на своей странице более 2,5 МБ текста.

РЕДАКТИРОВАТЬ: Ну, ваш вопрос полностью изменился, пока я писал свой ответ.Итак, объясняя, как поместить содержимое файла на страницу, и предполагая, что размер файла не превышает 2,5 МБ, ваша функция просмотра может выглядеть так:

def uploadView(request):
    upFile = request.FILES["upFile"]
    context = {}
    if upFile.multiple_chunks():
        context["uploadError"] = "Uploaded file is too big (%.2f MB)." % (upFile.size,)
    else:
        context["uploadedFile"] = upFile.read()
    return render_to_response('fileUploadPage.html', context)

Добавление, конечно, любой другой обработки представления, которая вам нужна.

Тогда в вашем шаблоне fileUploadPage.html должно быть где-то:

<div id="uploaded">
    {% if uploadError %}
    <span class="error">{{ uploadError }}</span>
    {% else %}
    {{ uploadedFile }}
    {% endif %}
</div>

РЕДАКТИРОВАТЬ 2: Доминик имеет хорошее мнение. Вот общий код шаблона для правильной установки тега form . Используйте это в шаблоне, который имеет форму:

<form method="post" action="{% url uploadFile %}"
{% if form.is_multipart %}
    enctype="multipart/form-data"
{% endif %}>
{{ form }}
</form>

В вашем случае, поскольку вы знаете, что в форме будет файл, вы можете потерять блок if :

<form method="post" action="{% url uploadFile %}" enctype="multipart/form-data">
{{ form }}
</form>

Примечание: {% url ___%} команда вставит URL-адрес представления или именованный URL-адрес. Параметр - это либо имя функции просмотра, используемое в вашем файле urls.py , либо имя, присвоенное объекту url , например:

urlpatterns = patterns('',
    url('^uploadform$', 'myapp.views.uploadFormView', name='uploadForm'),
    url('^upload$', 'myapp.views.uploadView', name='uploadFile'),
    # ...
)
9
ответ дан 14 December 2019 в 01:04
поделиться
Другие вопросы по тегам:

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