0 / 0 / 0
Регистрация: 04.03.2013
Сообщений: 25

Чтение файлов из url и отдача пользователю, на лету

04.03.2013, 20:59. Показов 7558. Ответов 14
Метки нет (Все метки)

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

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    import requests
 
    url = "http://www.test.ru/большой_файл.mp4"
    r = requests.get(url)
 
    file_for_download = urllib2.urlopen(url)
    response = HttpResponse(mimetype=r.headers['content-type'])
    response['Connection'] = 'keep-alive'
    response['Content-Disposition'] = 'attachment; filename=test.mp4'
    tmp=file_for_download.read(1024)
 
    while(tmp!=''):
        response.write(tmp)
        tmp=file_for_download.read(1024)
 
    return response

есть похожий код на пхп который работает правильно, вот как раз его и пытаюсь на python перевести, нужно нечто аналогичное:


PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
        $url = "http://www.test.ru/большой_файл.mp4";
    $headers = get_headers($url, TRUE);
    $name = basename($url);
 
    header($_SERVER['SERVER_PROTOCOL'] . ' 200 OK');
    header('Content-Length: ' . $headers['Content-Length']);
    header('Accept-Ranges: ' . ( isset($headers['Accept-Ranges']) ? $headers['Accept-Ranges'] : 'bytes' ) );
    header('Date: ' . $headers['Date']);
    header('Content-Type: ' . $headers['Content-Type']);
    header('Last-Modifed: ' . $headers['Last-Modifed']);
    header('Connection: keep-alive');
    header('Content-Disposition: attachment; filename="' . $name . '";');   
 
    @ob_end_clean();
 
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_NOPROGRESS, false);
    curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'callback');
    curl_setopt($ch, CURLOPT_BUFFERSIZE, 1024);
    curl_exec($ch);
    curl_close($ch);
 
 
function callback($ch, $data) {
    echo $data;
    ob_flush();
 
    return strlen($data);
}
?>

помогите пожалуйста реализовать это в питоне, заранее благодарен.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.03.2013, 20:59
Ответы с готовыми решениями:

Отдача файла пользователю
Доброго времени суток. Заполняю docx шаблон нужными мне данными, сохраняю его на сервер. Файл сохраняется нормально, открываю его...

Отдача больших файлов
Решаю вопрос отдачи больших файлов по средствам веб сервера, выбор встал между nginx и apache. Кто сталкивался с подобным или может дать...

Отдача файлов скриптом PHP
Доброго времени суток! Предо мной стоит задача, отдавать файлы через PHP (защищая их от прямого скачивания). Нашел множество решений,...

14
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
04.03.2013, 21:12
Цитата Сообщение от Error_256 Посмотреть сообщение
Python
1
return response
а где функция ?
0
0 / 0 / 0
Регистрация: 04.03.2013
Сообщений: 25
04.03.2013, 22:04  [ТС]
ну можно добавить сверху def func(request): но оно надо? я думал и так понятно что это кусок функции
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
04.03.2013, 22:46
Цитата Сообщение от Error_256 Посмотреть сообщение
я думал и так понятно что это кусок функции
нет, ты мог ошибиться, а мы бы думали, что у тебя там функция, поэтому я у тебя и спрашиваю

Цитата Сообщение от Error_256 Посмотреть сообщение
Python
1
while(tmp!=''):
вот, к примеру, написаны скобки, когда там не нужны скобки

зачем ты используешь requests, если скачиваешь через urrllib2 ?
0
0 / 0 / 0
Регистрация: 04.03.2013
Сообщений: 25
04.03.2013, 23:03  [ТС]
Цитата Сообщение от accept Посмотреть сообщение
нет, ты мог ошибиться, а мы бы думали, что у тебя там функция, поэтому я у тебя и спрашиваю


вот, к примеру, написаны скобки, когда там не нужны скобки

зачем ты используешь requests, если скачиваешь через urrllib2 ?
ну я много чего пробовал пока искал решение, requests осталось после этих попыток, ну вроде ошибки нет потому я внимания не обращал
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
04.03.2013, 23:07
вот так ты код и пишешь, какая-то лажа посреди кода осталась, а мы должны читать
самое главное, что из-за этого может что-нибудь сломаться, а ты даже знать не будешь
чисти код до самого необходимого
0
0 / 0 / 0
Регистрация: 04.03.2013
Сообщений: 25
04.03.2013, 23:59  [ТС]
я сюда за советом пришел, если бы всё работало я бы здесь оставил этот вопрос? вобщем задача предельно ясна, жду дельных советов
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
05.03.2013, 00:15
Цитата Сообщение от Error_256 Посмотреть сообщение
но буферезируется полностью и при отдаче больших файлов всё виснит
ты понимаешь, что из того, как ты написал код тут, следует то, как ты его там проверяешь ?
что далеко не факт, что ты его проверяешь правильно
0
0 / 0 / 0
Регистрация: 04.03.2013
Сообщений: 25
05.03.2013, 00:51  [ТС]
ты знаешь как переписать пхп-шный пример на питон?

Добавлено через 7 минут
давай я создам отдельную тему где попрошу тебя научить меня правильно "проверять"? =))) или еще еще давать какие нибудь советы, вобщем всё то что меня не интересует будем обсуждать... =)
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
05.03.2013, 01:04
у тебя urlopen() всегда будет скачивать файл целиком (по крайней мере, у меня оно пока не скачает, переменной не присваивает)
что этот php-пример делает ? он скачивает многократно, постоянно смещаясь по файлу с помощью заголовка Accept-Ranges ?

python.org. urlopen
параметр data нужно передать, в котором все эти заголовки пишутся
0
0 / 0 / 0
Регистрация: 04.03.2013
Сообщений: 25
05.03.2013, 21:26  [ТС]
почитал, попробовал... что-то ничего не пашет =( руки видать кривые
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
06.03.2013, 06:31
разберись с процессом, который нужно реализовать, составь алгоритм
0
224 / 209 / 63
Регистрация: 26.05.2011
Сообщений: 363
06.03.2013, 07:18
Цитата Сообщение от Error_256 Посмотреть сообщение
почитал, попробовал... что-то ничего не пашет =( руки видать кривые
Точнее плохо читал и плохо пробовал.
У функции request (пакет requests) есть параметр stream, который позволяет функции возвращать управление не загружая контент. Доступ к контенту можно получить используя атрибут raw объекта Response либо метод iter_content.

Добавлено через 4 минуты
Python
1
2
3
4
5
import requests
 
response = requests.get("http://www.test.ru/большой_файл.mp4", stream=True)
for chunk in response.iter_content(chunk_size=1024, decode_unicode=True):
    print(chunk)
Добавлено через 9 минут
с decode_unicode=True, погорячился - это для текста.
0
0 / 0 / 0
Регистрация: 04.03.2013
Сообщений: 25
06.03.2013, 18:01  [ТС]
а без print можно ? я функцию на django сайт впихну, собственно имея на вооружении print проблем бы не было
0
224 / 209 / 63
Регистрация: 26.05.2011
Сообщений: 363
07.03.2013, 03:59
Цитата Сообщение от Error_256 Посмотреть сообщение
а без print можно ?
А почему нет? print - функция, обрабатывающая очередной фрагмент контента, вместо нее может быть что угодно.

Если Ваш приемник данных - file-like объект, то можно так попробовать:
Python
1
2
3
4
5
import requests
import shutil
 
response = requests.get("http://www.test.ru/большой_файл.mp4", stream=True)
shutil.copyfileobj(response.raw, Ваш_приемник, 1024)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.03.2013, 03:59
Помогаю со студенческими работами здесь

Как заменить все url на лету?
Доброго вечера! Подскажите есть ли у веб серверов фича, которая сможет на лету заменить все ссылки. Нужно это сделать только для картинок...

Flask. Отдача файлов с русскоязычным названием
Нужно отдавать csv- файлы. Название - кирилицей, содержимое - тоже кирилицей. Исходная кодировка - utf8. Питон 3. Установка дополнительных...

Отдача файлов через X-Accel-Redirect, а загрузка средствами nginx?
Здравствуйте) Возникла непоняточка: давным давно был модуль &quot;nginx-upload-module&quot;, но его выпилили с пяток лет назад, а то и более.. ...

Чтение excel-файла на лету
Такая проблемка возникла: Есть Excel-файл, в который сторонее приложение по DDE-экспорту непрерывно выводит всякие данные. Мне в моем...

Обновление файлов сервера на лету и потоки.
Сервак крутится на IIS6. Среди всего прочего там есть HttpModule, который при инициализации создает отдельный поток. Работает поток так: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru