通过PUT使用Django上传文件

时间:2012-02-10 20:13:07

标签: python django put boto

我正在尝试在Django中实现一个功能,将图像从客户端(iPhone应用程序)上传到Amazon S3服务器。 iPhone应用程序发送带有HTTPBody中图像内容的HttpRequest(方法PUT)。例如,客户端将图像PUT到以下URL:http://127.0.0.1:8000/uploadimage/sampleImage.png/

我在Django中的功能看起来像这样处理这样的PUT请求并将文件保存到S3:

def store_in_s3(filename, content):
    conn = S3Connection(settings.ACCESS_KEY, settings.PASS_KEY) # gets access key and pass key from settings.py
    bucket = conn.create_bucket("somepicturebucket")
    k = Key(bucket)
    k.key = filename
    mime = mimetypes.guess_type(filename)[0]
    k.set_metadata("Content-Type", mime)
    k.set_contents_from_string(content)
    k.set_acl("public-read")

def upload_raw_data(request, name):
    if request.method == 'PUT':
        store_in_s3(name,request.raw_post_data)
        return HttpResponse('Upload of raw data to S3 successful')
    else:
        return HttpResponse('Upload not successful')

我的问题是如何告诉我的功能图像的名称。在我的urls.py中,我有以下内容,但它不起作用:

url(r'^uploadrawdata/(\d+)/', upload_raw_data ),

据我所知,d +代表数字,所以当我传递文件名时,这显然没用。但是,我想知道这是否是正确的方法。我阅读了这篇文章here,它建议我完全不理解以下代码行:

file_name = path.split("/")[-1:][0]

另外,我不知道其余的代码是什么。我对这一切都有点新意,所以任何关于如何简单上传图片的建议都会非常受欢迎。谢谢!

1 个答案:

答案 0 :(得分:1)

这个问题并不是关于上传,而且链接的答案是无关紧要的。如果您想接受字符串而不是URL中的数字,为了传递文件名,您只需在正则表达式中使用w而不是d

编辑以澄清抱歉,没有意识到您正在尝试传递整个文件+扩展程序。你可能想要这个:

r'^uploadrawdata/(.+)/$'

以便匹配任何角色。不过,您应该阅读正则表达式的介绍。