2012-04-19 3 views
1

내 django 프로젝트에서 다운로드 용 클라이언트 측에 zip 파일을 보내야합니다.이 zip 파일에는 다양한 URL에서 다운로드 한 이미지가 포함되어 있습니다.메모리에있는 url에서 이미지를 다운로드하고 메모리에 zip 아카이브를 작성하여 브라우저에 보내십시오.

이미지 파일을 디스크에 쓰지 않고 이미지를 메모리에 다운로드 한 다음 메모리에있는 zip 파일에 추가 할 수 있습니다. 다시 디스크에 zip 파일을 쓰지 않고 마지막으로 클라이언트에 zip 파일을 다운로드하여 다운로드 할 수 있습니까? ?

사실, urllib2는 이미지 다운로드에는 사용할 수 있지만 zip 파일로 작업 할 때는 zip 파일을 사용할 수 있지만 이러한 작업을 메모리 자체에서 수행하는 데 문제가 있음을 알고 있습니다. 따라서이 예제는 정말 감사하겠습니다.

당신은

답변

2

다운로드 urllib2를 사용하여 파일을 감사드립니다. 작성을 위해 새 ZipFile을 엽니 다 (이 경우 StringIO 객체가 필요함). url의 출력을 ZilpFile.writestr에 씁니다. 장고 응답에 zip 파일을 첨부하십시오.

response = urllib2.urlopen('http://..') 
img_bytes = response.read() 

을 한 후 우편 안에 당신은 이전에 실제 파일 대신있는 StringIO 핸들러를 통과 생성, 파일에이 바이트를 작성하는 ZipFile.writestr를 사용

import urllib2 
from StringIO import StringIO 

url = urllib2.urlopen('http://example.com/foo.jpg') 
f = StringIO() 
zip = zipfile.ZipFile(f, 'w') 
zip.writestr('foo.jpg', url.read()) 
response = HttpResponse(f.getvalue(), content_type="application/zip") 
response['Content-Disposition'] = 'attachment; filename=foobar.zip' 
return response 
+0

답장을 보내 주셔서 감사합니다. 하지만 클라이언트 측에서는 파일을 대화 상자로 저장하지 않습니다. 크롬 브라우저에서이 작업을 시도했습니다. – user1283941

+0

서버가 제공하는 응답은 무엇입니까? – John

+0

크롬 디버거에서 응답 창에서 일부 횡설수설 한 문자가 표시됩니다. 응답 헤더는 연결 : 연결 유지입니다. 콘텐츠 처리 : 첨부 파일. 파일 이름 = foobar.zip 콘텐츠 형식 : 응용 프로그램/zip 날짜 : 2012 년 4 월 19 일 21:19:18 GMT P3p : CP = "IDC 큐라의 ADMIA PHY ONL COM STA" 서버 : gunicorn/0.14. 2 transfer-encoding : chunked – user1283941

0

당신은 단순히 그 작업을 수행 할 수 있습니다 매니저. 파일 작성이 끝나면 HTTPResponse로 적절한 mimetype 및 내용 처리를 설정하여이를 반환하십시오.

하지만 RAM을 사용하지는 않습니다. 왜 tempfile.NamedTemporaryFile을 사용하지 않습니까?

+0

엄청난 양의 이미지를 압축하지 않으면 디스크에 이것을 적어 둘 이유가 없습니다. 그럼에도 불구하고 나는 그것이 많이 도움이 될지 확신하지 못한다. 당신이하는 일은 불필요한 디스크 io를 추가하는 것입니다 (웹 서버의 제한 요소가 될 가능성이 훨씬 큽니다) – John

+0

그것은 다운로드 작업에 대한 사용자 동시성에 달려 있습니다. 그가 다양한 링크에서 즉석에서 사진을 잡으면, 이것은 메모리가 지워지기까지 약간의 시간이 걸릴 수 있습니다. Django 문서에서 : 기본적으로 업로드 된 파일이 2.5 메가 바이트보다 작은 경우 Django는 업로드의 전체 내용을 메모리에 유지합니다. 그래서 사용량의 크기와 동시성에 달려 있습니다. –

관련 문제