Загруженный файл не является корректным файлом

Обновлено: 04.07.2024

Я использую Django Rest Framework и AngularJs для загрузки файла. Мой файл просмотра выглядит следующим образом:

Поскольку последняя строка метода post должна возвращать все данные, у меня есть несколько вопросов:

  • как проверить, есть ли что-либо в request.FILES ?
  • как сериализовать поле файла?
  • Как использовать парсер?
Просто примечание к модам: Django значительно обновился с 2013 года. Так что если кто-то еще напишет тот же вопрос сейчас. ПОЖАЛУЙСТА, не стреляйте в них ^ _ ^.

Используйте FileUploadParser, все это в запросе. Вместо этого используйте метод put, вы найдете пример в документах:)

@pleasedontbelong, почему здесь использовался метод PUT вместо POST? Привет @pleasedontbelong, если он создает новую запись, будет ли это вместо POST? и будет ли он работать с FileUploadParser? @pleasedontbelong RTan задает довольно хороший вопрос. Чтение RFC-2616 обеспечивает тонкость, о которой я не знал до сих пор. «Принципиальное различие между запросами POST и PUT отражается в различном значении Request-URI. URI в запросе POST идентифицирует ресурс, который будет обрабатывать вложенный объект. Этот ресурс может быть процессом приема данных, шлюзом к другому протоколу или отдельному объекту, который принимает аннотации. Напротив, URI в запросе PUT идентифицирует объект, заключенный в запросе " Почему FileUploadParser? «FileUploadParser предназначен для использования с собственными клиентами, которые могут загружать файл в виде запроса необработанных данных. Для загрузки через Интернет или для собственных клиентов с поддержкой многоэтапной загрузки следует использовать анализатор MultiPartParser». В общем, не похоже на хороший вариант. Более того, я не вижу загрузки файлов, требующей какого-либо особого подхода .

Я использую тот же стек и также ищу пример загрузки файла, но мой случай проще, поскольку я использую ModelViewSet вместо APIView. Ключ оказался крючком pre_save. Я закончил использовать его вместе с модулем загрузки angular -file-upload так:

Исходя из моего опыта, для полей файла не требуется специальной обработки.

Наконец, я могу загрузить изображение с помощью Django. Вот мой рабочий код

запрос curl для загрузки

почему destination.close () находится внутри цикла for? Проще использовать ModelViewSet . Кроме того, они, скорее всего, реализовали это лучше.

Потратив на это 1 день, я понял, что.

Первый метод будет работать из коробки, если у вас есть простые поля, но будет проблемой, если у вас есть вложенные сериализации. Многочастный синтаксический анализатор не сможет анализировать вложенные поля.

Ниже я предоставляю реализацию для обоих случаев

serializers.py → никаких особых изменений не требуется, не показывая здесь мой сериализатор как слишком длинный из-за возможности записи в поле ManyToMany.

Теперь, если вы следуете первому методу и отправляете только данные, отличные от Json, в виде пар ключ-значение, вам не нужен специальный класс синтаксического анализатора. DRF'd MultipartParser сделает всю работу. Но для второго случая или если у вас есть вложенные сериализаторы (как я показал), вам понадобится собственный анализатор, как показано ниже.

Этот сериализатор будет в основном анализировать любой JSON-контент в значениях.

Изображение 106423

Пример запроса в post man для обоих случаев: case 1 ,

Изображение 106424

Дело 2

Я бы предпочел избежать случая 2. Создание одной записи базы данных для каждого запроса должно выполняться в большинстве случаев.

Я решил эту проблему с ModelViewSet и ModelSerializer. Надеюсь, это поможет сообществу.

Я также предпочитаю, чтобы валидация и Object-> JSON (и наоборот) входили в сам сериализатор, а не в представления.

Давайте поймем это на примере.

Скажем, я хочу создать API FileUploader. Где он будет хранить поля, такие как id, file_path, file_name, size, owner и т.д. В базе данных. Смотрите образец модели ниже:

Теперь для API это то, что я хочу:

Когда я запускаю конечную точку GET, мне нужны все вышеуказанные поля для каждого загруженного файла.

Но для пользователя, чтобы создать/загрузить файл, почему он должен беспокоиться о пропуске всех этих полей. Она может просто загрузить файл, а затем, я полагаю, сериализатор может получить остальные поля из загруженного файла.

Searilizer: Вопрос: Я создал ниже сериализатор, чтобы служить моей цели. Но не уверен, что это правильный способ его реализации.

Просмотр для справки:

Какую логику проверки FileUploaderSerializer.validate метод FileUploaderSerializer.validate ?

Я хотел бы написать еще один вариант, который мне кажется более чистым и более легким в обслуживании. Мы будем использовать defaultRouter, чтобы добавить URL-адреса CRUD для нашего набора, и добавим еще один фиксированный URL-адрес, определяющий представление загрузчика в том же наборе.

Основной проект urls.py

Волшебство происходит, когда мы добавляем декоратор @action к нашему методу класса uploader. Указывая аргумент "method = ['put']", мы разрешаем только запросы PUT; идеально подходит для загрузки файлов.

Я также добавил аргумент "parser_classes", чтобы показать, что вы можете выбрать анализатор, который будет анализировать ваш контент. Я добавил CSVParser из пакета rest_framework_csv, чтобы продемонстрировать, как мы можем принимать только определенный тип файлов, если требуется эта функциональность, в моем случае я принимаю только "Content-Type: text/csv". Примечание. Если вы добавляете пользовательские парсеры, вам нужно будет указать их в parsers_classes во ViewSet, поскольку запрос будет сравнивать допустимый media_type с основным (классом) парсерами перед доступом к парсерам метода загрузки.

Существует множество потенциальных причин повреждения файла:

  • Внезапное отключение электроэнергии
  • Компьютер аварийно отключается при сохранении файла
  • Photoshop зависает или аварийно завершает работу при сохранении файла
  • Проблемы с подключением к сети
  • Проблемы с оборудованием, включая повреждение кабелей, отказ жестких дисков или модулей оперативной памяти

Тем не менее повреждения случаются редко. Если вы обнаружили, что один или несколько файлов повреждены, определите причину этого, чтобы предотвратить возникновение проблем в будущем при попытке восстановления файлов.

Если изображение выглядит искаженным на экране и повреждение не сохраняется в экспортированном файле или на отпечатке, вероятно, проблема связана с графической платой или драйвером.

Определите причину

Во-первых, следует определить, ограничено ли повреждение одним файлом или распространяется на несколько, чтобы снизить потенциальный ущерб данных.

Если поврежден только один файл, возможно, на компьютере произошел сбой, который вы не заметили или решили, что он не связан с данным файлом.

Если повреждено несколько файлов, ищите определенные закономерности:

  • Распространяется ли повреждение только на файлы в одном местоположении (папка, жесткий диск, сеть или съемный носитель)?
  • Были ли файлы созданы или изменены примерно в одно и то же время?
  • Были ли какие-либо изменения в компьютере во время последнего изменения файлов?

Если вы видите закономерность, которая указывает на то, что файлы связаны с общим оборудованием, проверьте кабели, попробуйте другой разъем или используйте другой жесткий диск, или же попробуйте применить жесткий диск вместо сетевого.

Если файлы были повреждены недавно и не имеют ограничений по времени, возможно, модуль ОЗУ функционирует неправильно.

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

Насколько безопасен исходный код при компиляции в Pyside
Существует ли защита от декомпиляции приложения созданного на Pyside?

Хранение изображений и загрузка изображений
Привет, не когда не работал с изображениями когда их много, и тут возникла такая не обходимость.

Загрузка изображений
Здравствуйте. Есть база изображений, например на web сервере, хостинге или соц сети. Задумка.

1. Вложенность большая
2. $info где создается?
3. Констатные данные вроде 71680 нужно хранить в константах
4. PHP_EOL константа есть и лучше ошибки сложить в массив, а затем заимплодить их
6.

Экстеншн не равняется mime. Если будет 4 вариант, тогда что? И если будет в другом реестре? .PNG ?

Добавлено через 3 минуты

Функция ожидает, что filename является корректным файлом изображения. Если будет передан файл не содержащий изображения, он может быть некорректно интерпретирован как изображение и функция завершится успешно, но массив при этом будет содержать бессмысленные значения.

Не используйте getimagesize() для проверки того, что файл является изображением. Для этих целей используйте модуль Fileinfo.

Добавлено через 5 минут
Вот это вообще надо в самое начало проверок вынести:
Экстеншн не равняется mime. Если будет 4 вариант, тогда что? И если будет в другом реестре? .PNG ? Имеется проверка на mime, получил mime как посоветовал Para bellum, и тем самым с помощью explode уже разобрал mime.
Теперь все верно?
crautcher, Para bellum, Спасибо Вам большое что указали на мои ошибки. Очень Вам признателен.

1. Если у Вас конечное местоположение картинки физически находится на другом сервере, то эта функция может давать сбой. В таком случае лучше предварительно сохранять копию файла и удалять его удачного перемещения.

Добавлено через 12 минут
Хотя бы так:

Добавлено через 2 минуты
Счас хоть можно понять что к чему

Загрузка изображений
Здравствуйте, уже много времени никак не могу реализовать массовую загрузку для сайта. Нашёл ajax.

Загрузка изображений
Здравствуйте, имеется такой код. var.


Загрузка изображений
Всем доброго времени суток. У меня вопрос касательно загрузки картинок на сайт. Как сделать так.

Загрузка Изображений
Всем привет!Вот у меня есть штука для создания постов там всеоголишь title и description,хочу.

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

Загрузка изображений
Всем привет! Подскажите как правильно организовать. Есть доска объявлений.

Загрузка изображений в бд
Как сделать загрузку в бд нескольких (в моем случае надо 3) изображений. вот я использую код.

Механизм поддержки конфигурации и механизм хранилища конфигурации предполагают, что изменения в конфигурацию должны вноситься по определённым правилам. Соблюдение этих правил даёт гарантию того, что конфигурация в дальнейшем будет работать правильно.

Механизм выгрузки конфигурации в файл .cf и загрузки её из файла учитывает необходимость соблюдения этих правил. Если вы выгрузили конфигурацию и изменили её в другой информационной базе, то вы не всегда сможете «просто так» загрузить её обратно в исходную базу. В некоторых ситуациях платформа попросит вас разблокировать объекты исходной конфигурации, если она находятся на поддержке или присоединена к хранилищу.

Когда вы имеете дело с файлом конфигурации .cf, вы изменяете его средствами 1С:Предприятия. Но, как вы знаете, в платформе существует и другой механизм, который позволяет вносить изменения в конфигурацию без использования платформы. Это механизм выгрузки конфигурации в файлы XML и загрузки из них.

По мере развития этого механизма появилась потенциальная возможность изменения конфигурации в обход правил, необходимых для поддержки конфигурации или работы хранилища. Такие изменения могут приводить к нарушению нормальной работы конфигурации.

Например, конфигурация находится на полной поддержке и обновляется автоматически. После загрузки из файлов XML она продолжит находиться на полной поддержке, но будет отличаться от конфигурации поставщика. Тогда первое же автоматическое обновление приведёт к тому, что изменения, внесённые XML-редактированием, будут удалены.

Другой пример, когда конфигурация присоединена к хранилищу. В результате загрузки конфигурации из файлов XML, объекты, незахваченные в хранилище, будут загружены и будут изменены. При обновлении конфигурации базы данных эти изменения попадут в базу данных. Однако при следующем захвате в хранилище одного из таких объектов, изменения, загруженные из файлов XML, потеряются. Потому что при захвате конфигуратор получает последнюю версию объекта из хранилища. Таким образом, если при загрузке из файлов XML какие-то объекты были добавлены, то при захвате родительского объекта они будут удалены.

Для того чтобы избежать подобных ситуаций и привести работу платформы к единому порядку, мы ввели ряд ограничений на загрузку конфигурации из файлов XML. Эти ограничения вводятся в трёх ситуациях.

Загрузка в конфигурацию, подключённую к хранилищу

01.jpg

  • Полная загрузка невозможна;
  • Частичная загрузка возможна только в том случае, когда все объекты, которые изменятся после загрузки, захвачены в хранилище.

Загрузка в конфигурацию, находящуюся на поддержке

03.jpg

  • Полная загрузка возможна только в том случае, когда все объекты конечной конфигурации являются редактируемыми;
  • Частичная загрузка возможна только в том случае, когда все объекты конечной конфигурации, которые изменятся после загрузки, являются редактируемыми.

Загрузка конфигурации, которая содержит настройки поддержки

02.jpg

Если XML выгрузка содержит настройки поддержки (файл ParentConfigurations.xml) то:

  • Полная загрузка невозможна;
  • Частичная загрузка невозможна в том случае, когда загружается корневой объект конфигурации (файл Configuration.xml) .

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

Чтобы загрузка такой конфигурации стала возможной, нужно в каталоге выгрузки удалить файл настроек поддержки. Если выгрузка выполнялась в линейном формате, это файл Configuration.ParentConfigurations. А если, если выгрузка выполнялась в иерархическом формате, то это файл Configuration.ParentConfigurations.bin.

В результате конфигурация будет загружена как снятая с поддержки. Но при этом вы должны понимать, что и вся информация о настройках поддержки будет потеряна. В дальнейшем вы не сможете ею воспользоваться.

Механизм поддержки конфигурации и механизм хранилища конфигурации предполагают, что изменения в конфигурацию должны вноситься по определённым правилам. Соблюдение этих правил даёт гарантию того, что конфигурация в дальнейшем будет работать правильно.

Механизм выгрузки конфигурации в файл .cf и загрузки её из файла учитывает необходимость соблюдения этих правил. Если вы выгрузили конфигурацию и изменили её в другой информационной базе, то вы не всегда сможете «просто так» загрузить её обратно в исходную базу. В некоторых ситуациях платформа попросит вас разблокировать объекты исходной конфигурации, если она находятся на поддержке или присоединена к хранилищу.

Когда вы имеете дело с файлом конфигурации .cf, вы изменяете его средствами 1С:Предприятия. Но, как вы знаете, в платформе существует и другой механизм, который позволяет вносить изменения в конфигурацию без использования платформы. Это механизм выгрузки конфигурации в файлы XML и загрузки из них.

По мере развития этого механизма появилась потенциальная возможность изменения конфигурации в обход правил, необходимых для поддержки конфигурации или работы хранилища. Такие изменения могут приводить к нарушению нормальной работы конфигурации.

Например, конфигурация находится на полной поддержке и обновляется автоматически. После загрузки из файлов XML она продолжит находиться на полной поддержке, но будет отличаться от конфигурации поставщика. Тогда первое же автоматическое обновление приведёт к тому, что изменения, внесённые XML-редактированием, будут удалены.

Другой пример, когда конфигурация присоединена к хранилищу. В результате загрузки конфигурации из файлов XML, объекты, незахваченные в хранилище, будут загружены и будут изменены. При обновлении конфигурации базы данных эти изменения попадут в базу данных. Однако при следующем захвате в хранилище одного из таких объектов, изменения, загруженные из файлов XML, потеряются. Потому что при захвате конфигуратор получает последнюю версию объекта из хранилища. Таким образом, если при загрузке из файлов XML какие-то объекты были добавлены, то при захвате родительского объекта они будут удалены.

Для того чтобы избежать подобных ситуаций и привести работу платформы к единому порядку, мы ввели ряд ограничений на загрузку конфигурации из файлов XML. Эти ограничения вводятся в трёх ситуациях.

Загрузка в конфигурацию, подключённую к хранилищу

01.jpg

  • Полная загрузка невозможна;
  • Частичная загрузка возможна только в том случае, когда все объекты, которые изменятся после загрузки, захвачены в хранилище.

Загрузка в конфигурацию, находящуюся на поддержке

03.jpg

  • Полная загрузка возможна только в том случае, когда все объекты конечной конфигурации являются редактируемыми;
  • Частичная загрузка возможна только в том случае, когда все объекты конечной конфигурации, которые изменятся после загрузки, являются редактируемыми.

Загрузка конфигурации, которая содержит настройки поддержки

02.jpg

Если XML выгрузка содержит настройки поддержки (файл ParentConfigurations.xml) то:

  • Полная загрузка невозможна;
  • Частичная загрузка невозможна в том случае, когда загружается корневой объект конфигурации (файл Configuration.xml) .

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

Чтобы загрузка такой конфигурации стала возможной, нужно в каталоге выгрузки удалить файл настроек поддержки. Если выгрузка выполнялась в линейном формате, это файл Configuration.ParentConfigurations. А если, если выгрузка выполнялась в иерархическом формате, то это файл Configuration.ParentConfigurations.bin.

В результате конфигурация будет загружена как снятая с поддержки. Но при этом вы должны понимать, что и вся информация о настройках поддержки будет потеряна. В дальнейшем вы не сможете ею воспользоваться.

Читайте также: