Уведомления

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

#1 Март 1, 2013 22:47:04

error_256
Зарегистрирован: 2013-02-26
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызвать окно для сохранения файла на компьютер

делаю так:
url='http://sait.ru/file.mp4'
urllib.urlretrieve(url, “/home/users/django/1.mp4”)

файл сохраняется на сервак, вопрос: как сохранить не на серваке а на компе, чтобы вылезло как обычно окно сохранения?

Отредактировано error_256 (Март 2, 2013 00:38:30)

Офлайн

#2 Март 2, 2013 00:35:36

error_256
Зарегистрирован: 2013-02-26
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызвать окно для сохранения файла на компьютер

Копался в инете нашел библу requests, но всё равно ничего не пашет:

import requests
headers = {'User-Agent':'Mozilla/4.0','Connection':'keep-alive','Content-Disposition':'attachment; filename=007.mp4'}
r = requests.post(url, headers=headers)

подскажите как быть…

Офлайн

#3 Март 2, 2013 05:20:11

nnmware
Зарегистрирован: 2012-07-21
Сообщения: 133
Репутация: +  13  -
Профиль   Отправить e-mail  

Вызвать окно для сохранения файла на компьютер

Навскидку

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

Грузанете так себе свой аватар.
Для других типов файлов не забывайте mimetype менять и имя под которым отдается клиенту.
Но надо не забывать что буфер не безразмерный, в случае больших файлов сначала все-таки стоит думаю сохранять скачанный файл. А потом уже его отдавать клиенту.

Отредактировано nnmware (Март 2, 2013 05:21:34)

Офлайн

#4 Март 2, 2013 21:45:49

error_256
Зарегистрирован: 2013-02-26
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызвать окно для сохранения файла на компьютер

спасибо, работает, но большие файлы скачивать не реально… надо чтобы по мере загрузки он отправлялся пользователю то что считалось (на лету…) вот по типу того что вы предложили я написал пример, однако он всё равно вначале буферезирует файл полностью и лишь потом отдает целиком в 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)

Офлайн

#5 Март 3, 2013 06:26:00

nnmware
Зарегистрирован: 2012-07-21
Сообщения: 133
Репутация: +  13  -
Профиль   Отправить e-mail  

Вызвать окно для сохранения файла на компьютер

У 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)

Офлайн

#6 Март 4, 2013 04:17:03

error_256
Зарегистрирован: 2013-02-26
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызвать окно для сохранения файла на компьютер

как только не извращался над выводом больших файлов так ничего путного и не вышло… 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);
}
?>

вобщем нужно тоже самое но не на пхп а на любимом питоне
P.S. от такой раздачи сервак не сильно напрягается? и сколько человек одновременно могут так качать без последствий?

Отредактировано error_256 (Март 4, 2013 07:23:24)

Офлайн

#7 Март 4, 2013 16:58:35

nnmware
Зарегистрирован: 2012-07-21
Сообщения: 133
Репутация: +  13  -
Профиль   Отправить e-mail  

Вызвать окно для сохранения файла на компьютер

Я думаю все-таки лучше использовать X-accel-redirect заголовок.
Вот тут гляньте
http://betalabs.ru/2010-01-06/xeshirovanie_imen_zagruzhaemyx_fajlov_v_django_chast_vtoraja/
Если не ошибаюсь, смысл- Вы кидаете в nginx определенный заголовок, а он уже сам там разберется.
Клиент будет считать что качает с Вашего сервера.

Офлайн

#8 Март 4, 2013 22:55:28

error_256
Зарегистрирован: 2013-02-26
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызвать окно для сохранения файла на компьютер

что-то я почитал там и ничего не понял ) вобщем тема пока не закрыта, надо как-то переписать пхп-шный код на питон…

Офлайн

  • Начало
  • » Django
  • » Вызвать окно для сохранения файла на компьютер[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version