【问题标题】:upload image files with specific directory structure to amazon s3 django将具有特定目录结构的图像文件上传到 amazon s3 django
【发布时间】:2013-12-08 08:43:04
【问题描述】:

我有一个 django 模型,它通过根据模型名称创建一些文件夹结构来将文件上传到本地文件夹

utils.py

def asset_upload(instance, filename):
    ctype = ContentType.objects.get_for_model(instance)
    model = ctype.model
    app = ctype.app_label    

    if model == 'product':
        # Assets for a Product
        user_id = instance.user.fs_uid
        product_id = instance.id
        output = 'user%s/product%s/assets/%s' % (user_id, product_id, filename)

    elif model == 'category':
        # Assets for a Product
        user_id = instance.user.fs_uid
        product_id = instance.id
        output = 'user%s/category%s/assets/%s' % (user_id, product_id, filename)

    else:
        raise NotImplementedError("Unsupported model for Image Upload")

    return output

models.py

class Product(models.Model):
    name = models.CharField(max_length = 36)
    description = models.TextField(max_length = 2000)
    created = models.DateTimeField(auto_now_add = True)
    updated = models.DateTimeField(auto_now = True)
    picture = models.ImageField(upload_to = utils.asset_upload, null = True, max_length = 250)
    picture.allow_tags = True

forms.py

class ProductForm(ModelForm):
    class Meta:
        model = Product

views.py

def product_creation(request):
    product_form = ProductForm()
    if request.method == 'POST':
        product_form = ProductForm(request.POST,request.FILES)
        if product_form.is_valid():
            obj = product_form.save(commit=False)
            obj........ = ....
            obj.save()
            return redirect(reverse('product_detail', args=[obj.id]))
    return render_to_response('products/product.html',
                                    { 'product_form':product_form,},
                                    context_instance = RequestContext(request))  

所以从上面的代码,我可以成功地将图片上传到media文件夹中

/media/user235/product269/assets/buscuits_butter.png
/media/user235/product269/assets/choclate_pie.png

但现在我想将上述图像存储到Amazon s3 而不是我的本地文件系统

所以通过谷歌搜索,我找到了一些类似here的代码

def store_in_s3(filename, content):
    conn = S3Connection(settings.ACCESS_KEY, settings.PASS_KEY)
    b = conn.create_bucket("bucket_name")
    mime = mimetypes.guess_type(filename)[0]
    k = Key(b)
    k.key = filename
    k.set_metadata("Content-Type", mime)
    k.set_contents_from_string(content)
    k.set_acl("public-read")

所以从上述函数中,如果我将文件路径与内容一起发送,那么我希望图像将保存到 amazon s3(通过提供所有凭据)

但我confused 是关于如何实现/将文件(带有一些目录路径)发送到这个函数的。

我尝试在模型中制作upload_to = None,但遇到错误

product: "picture": FileFields require an "upload_to" attribute.

现在我们也知道,要避免将文件保存到本地文件夹,并将其保存到亚马逊存储桶

那么任何人都可以告诉我如何hook/re arrange我上面的代码来上传具有我根据上面的模型结构生成的文件目录结构的图像

【问题讨论】:

    标签: django amazon-s3 image-uploading django-models


    【解决方案1】:

    看看 Django 的File Storage API,尤其是S3 Storage

    我不会将函数作为 upload_to 关键字传递。您可以考虑创建继承ImageField 并编写自己的命名方法。

    【讨论】:

      猜你喜欢
      • 2014-10-24
      • 2016-11-22
      • 2012-12-28
      • 2011-03-25
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 2011-11-10
      • 2011-04-16
      相关资源
      最近更新 更多