Python中的文件共享站点

时间:2010-05-24 21:40:10

标签: python file-upload cgi

我想设计一个简单的网站,其中一个人可以上传文件,然后将随机网页地址传递给可以下载的人。

此时,我有一个网页,有人可以成功上传存储在我的网络服务器上/ files /下的文件。

python脚本还会生成一个唯一的随机5字母代码,该代码存储在标识文件的数据库中

我有一个名为retrieve的页面,一个人应该去,输入5个字母的代码,它应该弹出一个文件框,询问保存文件的位置。

我的问题是:1)如何检索文件以供下载?此时我的检索脚本,获取代码,获取文件在我的服务器上的位置,但如何让浏览器开始下载?

2)如何阻止人们直接访问该文件?我应该更改文件的权限吗?

2 个答案:

答案 0 :(得分:2)

您如何为文件上传页面提供服务,以及如何让用户上传文件?
如果您使用的是Python的内置HTTP服务器模块,那么您应该没有任何问题 无论如何,这里是文件服务部分是如何使用Python的内置模块完成的(只是基本的想法)。

关于你的第二个问题,如果你首先使用这些模块,你可能不会问它,因为你必须明确地提供特定的文件。

import SocketServer
import BaseHTTPServer


class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):

    def do_GET(self):
        # The URL the client requested
        print self.path

        # analyze self.path, map the local file location...

        # open the file, load the data
        with open('test.py') as f: data = f.read()

        # send the headers
        self.send_response(200)
        self.send_header('Content-type', 'application/octet-stream') # you may change the content type
        self.end_headers()
        # If the file is not found, send error code 404 instead of 200 and display a message accordingly, as you wish.

        # wfile is a file-like object. writing data to it will send it to the client
        self.wfile.write(data)

        # XXX: Obviously, you might want to send the file in segments instead of loading it as a whole


if __name__ == '__main__':

    PORT = 8080 # XXX

    try:
        server = SocketServer.ThreadingTCPServer(('', 8080), RequestHandler)
        server.serve_forever()
    except KeyboardInterrupt:
        server.socket.close()

答案 1 :(得分:0)

您应发送正确的HTTP响应,其中包含二进制数据并使浏览器对其做出反应。

如果您正在使用Django,请尝试此操作(我没有):

response = HttpResponse()
response['X-Sendfile'] = os.path.join(settings.MEDIA_ROOT, file.file.path)
content_type, encoding = mimetypes.guess_type(file.file.read())            
if not content_type:
    content_type = 'application/octet-stream'            
response['Content-Type'] = content_type            
response['Content-Length'] = file.file.size            
response['Content-Disposition'] = 'attachment; filename="%s"' % file.file.name
return response

来源:http://www.chicagodjango.com/blog/permission-based-file-serving/