Загрузка файла с помощью Django через PUT

Я пытаюсь реализовать в Django функцию для загрузки изображения с клиента (приложения для iPhone) на сервер Amazon S3. Приложение iPhone отправляет HttpRequest (метод PUT) с содержимым изображения в HTTPBody. Например, клиент размещает изображение по следующему 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+ означает цифры, поэтому здесь, очевидно, бесполезно, когда я передаю имя файла. Тем не менее, мне было интересно, если это правильный путь в первую очередь. Я прочитал этот пост здесь и он предлагает следующую строку кода, которую я вообще не понимаю:

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

Кроме того, я понятия не имею, о чем остальная часть кода. Я немного новичок во всем этом, поэтому любые предложения о том, как просто загрузить изображение, будут очень кстати. Спасибо!


person n.evermind    schedule 10.02.2012    source источник


Ответы (1)


Этот вопрос на самом деле не о загрузке, и связанный ответ не имеет значения. Если вы хотите принять строку, а не цифры в URL-адресе, для передачи имени файла вы можете просто использовать w вместо d в регулярном выражении.

Изменить для уточнения Извините, я не знал, что вы пытаетесь передать файл целиком + расширение. Вы, вероятно, хотите этого:

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

чтобы он соответствовал любому символу. Однако вам, вероятно, следует прочитать введение в регулярные выражения.

person Daniel Roseman    schedule 10.02.2012
comment
Спасибо Даниэль. Но почему связанный ответ не имеет значения? Он также пытается выполнить загрузку через PUT? У меня просто ощущение, что я делаю что-то в корне неправильное. Возможно, мне не следует использовать PUT для своих целей, или, возможно, у меня должен быть какой-то код в связанном ответе, который я не понимаю... - person n.evermind; 11.02.2012
comment
Кроме того, я попробовал url(r'^uploadrawdata/(\w+)/', upload_raw_data ), но получил сообщение об ошибке. Текущий URL, ‹code›uploadrawdata/MD5-HASH-SOMETHING.png/‹/code›, не совпало ни с одним из них. при попытке PUT на 127.0.0.1:8000/uploadrawdata/MD5-HASH- ЧТО-ТО.png - person n.evermind; 11.02.2012