【发布时间】: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