使用Django通过PUT上传文件
我正在尝试在Django中实现一个功能,目的是让客户端(一个iPhone应用)能够上传图片到亚马逊的S3服务器。这个iPhone应用会发送一个HttpRequest(使用PUT方法),把图片的内容放在HTTP请求的主体里。比如,客户端会把图片上传到这个网址: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+代表数字,所以在我传递文件名的时候,这个显然没用。不过,我在想,这样做是否正确。我看过这篇帖子这里,里面建议了以下代码行,但我完全不理解:
file_name = path.split("/")[-1:][0]
此外,我对其余的代码也没有头绪。我对这一切还比较陌生,所以任何关于如何简单上传图片的建议都非常欢迎。谢谢!
1 个回答
1
这个问题其实跟上传没什么关系,链接的回答也不相关。如果你想在网址中接受一个字符串而不是数字,以便传递文件名,你只需要在正则表达式中把 d
改成 w
就可以了。
编辑说明 抱歉,我没意识到你是想传递整个文件名加扩展名。你可能需要这个:
r'^uploadrawdata/(.+)/$'
这样就可以匹配任何字符。不过,你可能还是应该先了解一下正则表达式的基础知识。