Форум сайта python.su
делаю так:
url='http://sait.ru/file.mp4'
urllib.urlretrieve(url, “/home/users/django/1.mp4”)
файл сохраняется на сервак, вопрос: как сохранить не на серваке а на компе, чтобы вылезло как обычно окно сохранения?
Отредактировано error_256 (Март 2, 2013 00:38:30)
Офлайн
Копался в инете нашел библу requests, но всё равно ничего не пашет:
import requests
headers = {'User-Agent':'Mozilla/4.0','Connection':'keep-alive','Content-Disposition':'attachment; filename=007.mp4'}
r = requests.post(url, headers=headers)
подскажите как быть…
Офлайн
Навскидку
def download_file(request): file_for_download = urllib2.urlopen('http://www.gravatar.com/avatar/d04439c330146886dad39b200c7f833d?default=retro&size=60') response = HttpResponse(mimetype='application/image') response['Content-Disposition'] = 'attachment; filename=avatar_of_error256.jpg' response.write(file_for_download.read()) return response
Отредактировано nnmware (Март 2, 2013 05:21:34)
Офлайн
спасибо, работает, но большие файлы скачивать не реально… надо чтобы по мере загрузки он отправлялся пользователю то что считалось (на лету…) вот по типу того что вы предложили я написал пример, однако он всё равно вначале буферезирует файл полностью и лишь потом отдает целиком в return response, а надо чтобы по частям, в php это реально сделать но в питоне не знаю как:
import requests 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
Отредактировано error_256 (Март 3, 2013 04:48:37)
Офлайн
У Django есть StreamingHttpResponse, который дает возможность отдавать в ответ поток.
Аргументом надо передавать генератор, отдающий содержимое файла.
Но у меня сейчас ооооочень дохленький канал, и файл читается не всегда до конца.
Не могу гарантировать что это из-за канала, но и не могу гарантировать что я предложил правильное решение.
def download_file(request): file_for_download = urllib2.urlopen('http://ru.fishki.net/picsw/032013/02/dengi/tn.jpg') response = StreamingHttpResponse(read_in_chunks(file_for_download), mimetype='application/image') response['Content-Disposition'] = 'attachment; filename=avatar_of_error256.jpg' return response def read_in_chunks(file_object): while True: data = file_object.read(1024) if not data: break yield data
Отредактировано nnmware (Март 3, 2013 06:31:09)
Офлайн
как только не извращался над выводом больших файлов так ничего путного и не вышло… StreamingHttpResponse ситуацию не исправил
пример выше опять же отдает весь файл целиком после буферизации, ниже я приведу пример закачки файлов на пхп, там всё работает как надо, неужто на django подобного повторить нельзя без гемороя?
<?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); } ?>
Отредактировано error_256 (Март 4, 2013 07:23:24)
Офлайн
Я думаю все-таки лучше использовать X-accel-redirect заголовок.
Вот тут гляньте
http://betalabs.ru/2010-01-06/xeshirovanie_imen_zagruzhaemyx_fajlov_v_django_chast_vtoraja/
Если не ошибаюсь, смысл- Вы кидаете в nginx определенный заголовок, а он уже сам там разберется.
Клиент будет считать что качает с Вашего сервера.
Офлайн
что-то я почитал там и ничего не понял ) вобщем тема пока не закрыта, надо как-то переписать пхп-шный код на питон…
Офлайн