5

I simply want to upload an image (JPG) using a form, then send that image to Rackspace 'Cloud Files' or Amazon 'S3'.

  • No manipulating the file.
  • No saving to disk, everything to memory (am hosted on a cloud server)
  • Image size won't exceed 75kb

Update (Two Caveats):

  • One: It also needs to work when data is posted from a phone app.
  • Two: It needs to be sent to Rackspace Cloud Files as well as S3 (starting with CF).

The code below works but it is way WAY too heavy.

import cloudfiles as cf
def uploadImage(request, id):

  cf_con = cf.get_connection(username='YYY', api_key='XXX', serviceNet=True)
  container = cf_con.get_container('container_name')

  file = request.FILES["item_photo"]
  f = StringIO(file.read())
  f = Image.open(f)

  ### Only works if I resize for some reason, otherwise uploads a broken file
  image = f.resize((600,600), Image.ANTIALIAS)
  o = StringIO()
  image.save(o, "JPEG", quality=80)
  image = o.getvalue()

  file_name  = "%s/%s" % (id, '600x600.jpeg')

  ### This simply uploads to Rackspace Cloud files.
  put_file(container, file_name, image)

Thanks so much, Hope all is well ...

d.

4

2 回答 2

3

如何完全忽略python并直接上传到s3?

您可以将 s3 存储桶配置为禁止上传任何大于 $X 字节的文件。

这是一个简单的示例来说明直接上传到 s3(并忽略您的图像宽度/高度条件)

http://sente.cc/upload_to_s3.html

代码:

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  </head>
  <body>
  <h3>refresh the page after you've submitted to see your new image</h3>
    <div style="width:300px">
    <form action="http://s3.amazonaws.com/dev.sente" method="post" enctype="multipart/form-data">
      <fieldset>
      <input type="hidden" name="acl" value="public-read" /> <br />
      <i>name of key:</i><input type="text" name="key" readonly="true" value="image.jpg" /> <br />
      <input name="file" type="file" /> <br />
      <input name="submit" value="Upload" type="submit" />
    </fieldset>
    </form>
  </div>
    <br>
    <a href="http://s3.amazonaws.com/dev.sente/image.jpg">http://s3.amazonaws.com/dev.sente/image.jpg</a>
      <br>
      <a href="http://s3.amazonaws.com/dev.sente/image.jpg"><img src="http://s3.amazonaws.com/dev.sente/image.jpg"></a>
    </a>
  </body>
</html>
于 2011-08-02T12:49:26.133 回答
2

挑出来。找到了一种更简单优雅的方法,并为没有早点使用它而感到愚蠢。

file = request.FILES["item_photo"]
file_name = "%s/%s" % (id, '600.jpeg')
put_file(container, file_name, file.read())
于 2011-08-03T04:06:26.780 回答