使用Django通过PUT上传文件

0 投票
1 回答
654 浏览
提问于 2025-04-17 12:48

我正在尝试在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/(.+)/$'

这样就可以匹配任何字符。不过,你可能还是应该先了解一下正则表达式的基础知识。

撰写回答