2015-01-26 2 views
1

(마이크로 웹 프레임 워크)에 의해 웹 브라우저에서 시작되지 않습니다, 우리는 볼 수 있습니다다운로드 플라스크에 flask.Response

템플릿에서
@app.route('/download/<id>/<resolution>/<extension>/') 
def download_by_id(id, resolution=None, extension=None): 
    stream = youtube.stream_url(id, resolution, extension) 
    binary = requests.get(stream['url'], stream=True) 
    return flask.Response(
     binary, 
     headers={'Content-Disposition': 'attachment; ' 
             'filename=' + stream['filename']}) 

우리가 <a href="/download/adkdsk457jds/240p/mp4/">Download 240p Video</a>로 링크가 그것은 그것,을 클릭 할 때 해당 동영상 다운로드를 시작해야합니다.

문제는 다음과 같습니다

그것은 등 IDM 같은 더 다운로드 관리자가 설치되어 있지 않은 일부 브라우저에서 잘 작동한다. 그러나 IDM은 다운로드하지 않습니다. IDM이 (가) 만료됩니다. http://example.com/download/adkdsk457jds/240p/mp4/

Firefox 자체 다운로드 관리자의 경우와 같습니다. Firefox는 단지 실제 .html 페이지를 다운로드하고 실제 비디오는 다운로드하지 않습니다.

그러나 IDM 또는 다른 다운로드 관리자가 설치되어 있지 않으면 Chrome에서 동영상이 성공적으로 다운로드됩니다.

도움이되고 조언이 필요하지 않습니다. 코드에서 뭔가를 변경해야합니까?

+0

URL을 변경하여 '.mp4'로 끝내려고 했습니까? URL에 의해 –

+0

, 당신은 video1.mp4로 파일 이름을 변경하거나 무엇을 의미합니까? – CracLock

+0

'route' 인자와'href'가 포함하고있는 것이 무엇입니까. –

답변

1

헤더에 'Content-Type': 'application/octet-stream' 추가; 원래 응답에 대한 정보를 조금 더 복사하여 반환 할 응답 유형을 알려줘야합니다. 그렇지 않으면 기본값이 사용됩니다 (HTTP 표준 또는 Flask로 지정).

특히, 적어도 당신은 콘텐츠 유형, 길이에 걸쳐 복사 할 및 전송 인코딩 : 나는 response.raw 기본 원시 파일 객체를 사용하고

headers={ 
    'Content-Disposition': 'attachment; filename=' + stream['filename'] 
} 
for header in ('content-type', 'content-length', 'transfer-encoding'): 
    if header in binary.headers: 
     headers[header] = binary.headers[header] 
return flask.Response(binary.raw, headers=headers) 

; 이 방법도 효과가 있지만 YouTube에서 적용한 모든 압축이 유지된다는 장점이 있습니다.

일부 다운로드 관리자는 서버가 해당 요청을 지원한다고 광고하지 않는 경우에도 HTTP range request을 사용하여 다운로드를 병렬로 시도하려고 시도 할 수 있습니다. 406 Not Acceptable 응답 (지원되지 않는 바이트 범위 요청은 Accept-* 위반 임)으로 응답해야합니다. 이 경우 다운로드 관리자가 보내는 헤더를 기록해야합니다.

+0

당신이 말하는이 '응답'은 무엇입니까? – CracLock

+0

@CracLock : 사과, 코드에서 'binary'라고했습니다. –

+0

이 'binary'를 사용하여'file size'와'time'을 결정할 방법이 있습니까? 그래서 다운로드 관리자가 잡아서'헤더 '로 보낼 수 있습니다. – CracLock

0

당신은 콘텐츠 형식을 포함한 모든 응답 정보를 포함하지 않은

+0

그리고 그것은 마술처럼 Flask가 HTTP 범위 요청을 처리하도록 만들까요? –

+1

방금 ​​"Firefox가 .html 페이지를 다운로드합니다"라고 언급 한 이후 힌트를주었습니다. 그리고 나는 http-range가 항상 content-type과 결합되어야한다고 생각합니다. –

+0

글쎄, 내게 그것은 매력처럼 일했다. :-) 헤더에 이것을 추가하면 다운로드 관리자가 파일을 제대로 잡을 수 있습니다. 그러나 Download Manager의'time left' 파일 크기가 누락되었는데, 무엇을해야합니까? – CracLock

관련 문제