2009-09-19 38 views
5

Nếu một máy chủ HTTP sẽ được viết bằng Python2.6 có quyền truy cập cục bộ vào một tệp, thì cách nào chính xác nhất để máy chủ đó trả về tệp cho máy khách, theo yêu cầu?Cách gửi tệp qua HTTP, cách tốt, sử dụng Python?

Hãy nói rằng đây là tình hình hiện nay:

header('Content-Type', file.mimetype) 
header('Content-Length', file.size) # file size in bytes 
header('Content-MD5', file.hash) # an md5 hash of the entire file 

return open(file.path).read() 

Tất cả các tập tin được .zip hoặc .rar tài liệu lưu trữ không lớn hơn một vài MB.

Với tình hình hiện tại, trình duyệt xử lý tải xuống đến kỳ lạ. Chẳng hạn, không có trình duyệt nào biết tên của tệp, vì vậy, chúng sử dụng tên ngẫu nhiên hoặc tệp mặc định. (Firefox thậm chí còn lưu tệp với phần mở rộng .part, mặc dù nó đã hoàn thành và hoàn toàn có thể sử dụng được.)

Cách tốt nhất để sửa lỗi này và các lỗi khác mà tôi có thể chưa biết là gì?

Tôi không gửi được tiêu đề nào?

Cảm ơn!

+3

"Không có trình duyệt nào biết tên của tệp, ví dụ: để họ sử dụng tên tệp ngẫu nhiên hoặc mặc định". Tiêu đề Xử lý nội dung xử lý việc này, phải không? - http://www.ietf.org/rfc/rfc2183.txt – rnicholson

Trả lời

6

Đây là cách tôi gửi tập tin ZIP,

req.send_response(200) 
    req.send_header('Content-Type', 'application/zip') 
    req.send_header('Content-Disposition', 'attachment;' 
        'filename=%s' % filename) 

Hầu hết các trình duyệt xử lý nó một cách chính xác.

1

Nếu bạn không cần phải trả lại cơ thể phản ứng (có nghĩa là, nếu bạn có một dòng cho cơ thể phản ứng bằng cách khuôn khổ của bạn), bạn có thể tránh được giữ tập tin trong bộ nhớ với một cái gì đó như thế này:

fp = file(path_to_the_file, 'rb') 
while True: 
    bytes = fp.read(8192) 
    if bytes: 
     response.write(bytes) 
    else: 
     return 

Bạn đang sử dụng khung web nào?

+0

Tôi đang sử dụng webpy. Vì nó dường như không hiển thị một bộ mô tả tập tin, tôi đoán là tôi có thể từ từ đưa ra tập tin? –

+1

Dường như chính xác những gì các tác giả web.py đề xuất: http://webpy.org/cookbook/streaming_large_files – dcrosta

Các vấn đề liên quan