使用Django上传图片-从表单到Rackspace / S3而无需操作

5
我想通过一个表单上传图像(JPG),然后将该图像发送到Rackspace“Cloud Files”或Amazon“S3”,不需要操作文件,所有内容都保存在内存中(我托管在云服务器上),图像大小不会超过75kb。 更新(两个注意事项):
1. 当数据从手机应用程序发布时,它还需要正常工作。 2. 它需要被发送到Rackspace Cloud Files以及S3(从CF开始)。
下面的代码可以工作,但太过沉重。
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)

非常感谢,希望一切顺利...
d.

1
我有点困惑,你的示例代码调整了图像大小,但是你的描述说“不要操作文件”。这到底是怎么回事?如果你想要调整图像大小,那么你所做的大部分工作都是必要的。 - sente
1
谢谢@stuart,我不想调整图片大小,我试图上传没有进行操作的图片,但它上传了一个损坏的文件,上面的代码可以工作,但太重了并且强制调整大小。在完美的世界里,我希望简单地执行以下操作:file = request.FILES["item_photo"] file_name = "%s/%s" % (id, '600x600.jpeg') put_file(container, file_name, file)但这对我不起作用。 - Danny
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>

1
嘿,这真的很棒。我没有想到过。我的唯一问题是两个注意事项。
  • 一:当数据从手机应用程序发布时,它也需要正常工作。
  • 二:它需要发送到Rackspace Cloud Files。
- Danny

2

整理完毕。找到了更简单、优雅的方法,为之前没有想到而感到愚蠢。

file = request.FILES["item_photo"]
file_name = "%s/%s" % (id, '600.jpeg')
put_file(container, file_name, file.read())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接