我正在尝试在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]
另外,我不知道其余的代码是什么。我对这一切都有点新意,所以任何关于如何简单上传图片的建议都会非常受欢迎。谢谢!
答案 0 :(得分:1)
这个问题并不是关于上传,而且链接的答案是无关紧要的。如果您想接受字符串而不是URL中的数字,为了传递文件名,您只需在正则表达式中使用w
而不是d
。
编辑以澄清抱歉,没有意识到您正在尝试传递整个文件+扩展程序。你可能想要这个:
r'^uploadrawdata/(.+)/$'
以便匹配任何角色。不过,您应该阅读正则表达式的介绍。