С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/40: Рейтинг темы: голосов - 40, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 04.03.2013
Сообщений: 25

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

04.03.2013, 20:59. Показов 7520. Ответов 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
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru