2012-02-10 89 views
0

我想在Django中实现一个将客户端(iPhone应用程序)的图像上传到Amazon S3服务器的功能。 iPhone应用程序发送一个HttpRequest(方法PUT)与HTTPBody中的图像内容。举例来说,客户端图像提出以下网址:http://127.0.0.1:8000/uploadimage/sampleImage.png/使用Django通过PUT文件上传

我的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

这个问题并不是真的关于上传,而且链接的答案是不相关的。如果你想接受一个字符串而不是URL中的数字,为了传递一个文件名,你可以在正则表达式中使用w而不是d

编辑澄清对不起,你没有意识到你试图传递整个文件+扩展名。您可能需要:

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

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

+0

谢谢丹尼尔。但为什么相关的答案不相关?它试图通过PUT进行上传?我只是觉得我正在做一些根本性错误的事情。也许我不应该为我的目的使用PUT,或者我应该有一些链接的答案中的代码,我不明白... – 2012-02-10 20:27:01

+0

另外,我试过url(r'^ uploadrawdata /(\ w +)/ ',upload_raw_data),但是会收到错误消息“当前的URL,uploadrawdata/MD5-HASH-SOMETHING.png/,与这些中的任何一个都不匹配。”当尝试PUT到http://127.0.0.1:8000/uploadrawdata/MD5-HASH-SOMETHING.png/ – 2012-02-10 20:30:59