Найти - Пользователи
Полная версия: Вызвать окно для сохранения файла на компьютер
Начало » Django » Вызвать окно для сохранения файла на компьютер
1
error_256
делаю так:
url='http://sait.ru/file.mp4'
urllib.urlretrieve(url, “/home/users/django/1.mp4”)

файл сохраняется на сервак, вопрос: как сохранить не на серваке а на компе, чтобы вылезло как обычно окно сохранения?
error_256
Копался в инете нашел библу requests, но всё равно ничего не пашет:

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

подскажите как быть…
nnmware
Навскидку

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

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

Вообще по уму такие вещи(особенно с большими файлами) как реверс-прокси на уровне веб-сервера надо решать, а с джанго только заголовками манипулировать.
error_256
как только не извращался над выводом больших файлов так ничего путного и не вышло… 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. от такой раздачи сервак не сильно напрягается? и сколько человек одновременно могут так качать без последствий?
nnmware
Я думаю все-таки лучше использовать X-accel-redirect заголовок.
Вот тут гляньте
http://betalabs.ru/2010-01-06/xeshirovanie_imen_zagruzhaemyx_fajlov_v_django_chast_vtoraja/
Если не ошибаюсь, смысл- Вы кидаете в nginx определенный заголовок, а он уже сам там разберется.
Клиент будет считать что качает с Вашего сервера.
error_256
что-то я почитал там и ничего не понял ) вобщем тема пока не закрыта, надо как-то переписать пхп-шный код на питон…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB