Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Загрузка файлов и пересылка их на другой ресурс [RSS Feed]

#1 Авг. 2, 2016 21:16:51

Master_Sergius
Зарегистрирован: 2013-09-12
Сообщения: 271
Репутация: +  7  -
Профиль   Отправить e-mail  

Загрузка файлов и пересылка их на другой ресурс

Имеется серьёзное приложение с веб-интерфейсом. В одной из вкладок нужно сделать красивый интерфейс для работы со сторонним ресурсом через его API. Что нужно - загрузить файлы с локального компьютера и отослать их на тот сторонний ресурс, получить хеши файлов, ибо по хешах потом нужно достать отчёты по файлах с того же стороннего ресурса.
Насчёт загрузки файлов вроде более-менее понятно - https://docs.djangoproject.com/ja/1.9/topics/http/file-uploads/

Но вот вопрос, единственный ли это способ? Можно ли как-то передать файлы с помощью JQuery в стиле:

 $.post('send_files', files).done(делаем что-то).fail(делаем что-то другое)
, где send_files - это урл джанги, который связан с вьюшкой? Ибо мне ещё надо некоторые связанные действия на странице сделать. Или может быть у кого-то была подобная задача, прошу поделиться хотя бы алгоритмом, может быть советы хоть какие-то.

Вот, нашел такое на stackoverflow:
http://stackoverflow.com/questions/20822823/django-jquery-ajax-file-upload

Использовал ту ajax-функцию, но в браузере в Post не показывает файла, есть лишь csrf-token и другие поля формы, но только не файл. Возможно, имеет смысл спросить на JS/JQuery форумах…

Вот, такой код заработал и отослал файл:

 var csrftoken = document.getElementsByName('csrfmiddlewaretoken')[0].value
var formData = new FormData($("#send_file_form")[0]);
var formData = new FormData(); 
formData.append("file", $('#file_input')[0].files[0]);
formData.append("csrfmiddlewaretoken", csrftoken);
$.ajax({  
   type: "POST", 
   url: "send_files",  
   data: formData, 
   contentType: false, 
   processData: false, 
});  

Как видно, он отсылает первый файл, ну в теории, циклом пройтись и подобавлять в форму можно все файлы. Главное, что django приняло файл в request.FILES переменную. Теперь надо подпилить всё немного, может чего доброго и выйдет.

Таки вышло, вот так пока-что работает, нужно ещё украсить:

 var formData = new FormData($("#scan_files_form")[0]);
var formData = new FormData();
var files = $('#files')[0].files;
for (var i = 0; i < files.length; i++) {
       var file = files[i];
       formData.append('files', file, file.name)
 }
var csrftoken = $('#csrftoken').val();
formData.append("csrfmiddlewaretoken", csrftoken);
var description = $('#description').val();
formData.append("description", description);
$.ajax({
     type: "POST",
     url: "scan_files",
     data: formData,
     contentType: false,
     processData: false,
});

В Django (версия 1.5) вот прием:
 file_list = request.FILES.getlist('files')

Ну и сама форма должна быть с такими параметрами:

 <form id="scan_files_form" enctype="multipart/form-data" method="post" name="scan_files_form">

Теперь можно приступать ко второй части - передачу этих файлов дальше.



———————————————————————————
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Отредактировано Master_Sergius (Авг. 3, 2016 17:06:59)

Офлайн

#2 Авг. 15, 2016 17:28:46

inoks
От: Russia
Зарегистрирован: 2012-12-11
Сообщения: 343
Репутация: +  35  -
Профиль   Адрес электронной почты  

Загрузка файлов и пересылка их на другой ресурс

Серьезному приложению нужны серьезные программисты!

P.S. В чем вопрос?

Офлайн

#3 Авг. 15, 2016 18:16:10

Master_Sergius
Зарегистрирован: 2013-09-12
Сообщения: 271
Репутация: +  7  -
Профиль   Отправить e-mail  

Загрузка файлов и пересылка их на другой ресурс

inoks
Серьезному приложению нужны серьезные программисты!P.S. В чем вопрос?

Сначала блы вопрос. Пока никто ничего не ответил, сам всё решил и поделился ответом.



———————————————————————————
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Офлайн

  • Начало
  • » Django
  • » Загрузка файлов и пересылка их на другой ресурс[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version