Django如何让上传的图片保存到自己想要的路径

从我上一篇博文(http://blog.csdn.net/cendywang/article/details/17587001)中我们大致知道了MEDIA_ROOT, MEDIA_URL, STATIC_ROOT和STATIC_URL的作用。但是有一个问题,就是用户上传的图片,虽然upload_to中可以指定相关的参数,但最终还是固定死了的。如upload_to = username, 则为os.path.join(MEDIA_ROOT, upload_to)了。

看网上有很多人通过修改FileField和ImageField的save函数等方法,来达到动态修改的一种目的。在项目中我也碰到了类似的情况,不过我并没有使用FileField的upload_to这个参数,而是交给我自己的函数,使用write自己完成相关的保存工作。

1、设置上传的数据form

class PicForm(forms.Form):
    value = forms.CharField(max_length=100)
    pic   = forms.FileField()
这里可以看到,我在FileField里,并没有添加upload_to参数。

2、对上传的文件进行目的地保存操作:

def picupload(request):
    if 'POST' == request.method:
      form = PicForm(request.POST, request.FILES)
      if form.is_valid():
          dest = "/home/user/media/default.jpg"
          if os.path.exists(dest):
              os.remove(dest)
          reqfile = form.cleaned_data['pic']
          with open(dest, "wb+") as destination:
          for chunk in reqfile.chunks():
              destination.write(chunk)
          return dest

这里只是一个示例片段,想法就是对于上传的图片,都用一个函数来对这个文件重新保存一次到想要的地址,然后通过函数return相关的地址交由网页来访问

3、为什么不用static?而是media?

可能有细心的兄弟发现,我这里是放在media的目录里。

的确如此,虽然我们想自己来控制保存的地址,但还是保存在MEDIA_ROOT目录下比较好,这样在未来部署时的访问会带来很大的方便。

为什么不是STATIC_ROOT?就像我在上面提到的博文中描述的,STATIC_ROOT在开发模式和部署模式下是完全不同的。在开发模式下,STATIC_ROOT中最好什么都不放;因此会造成最终开发与部署的不一致。

4、为什么要使用自己定义保存路径?最后还是保存在MEDIA_ROOT中,这不是脱了裤子放屁么?

事实上,我这里只是做一个例子来讲解如何保存到自己想要的地方,而现实中的用处还比较大。比如说,我有很多个用户,每个用户都有自己的头像,那么我可以这样来写:

def picupload(request, username):
    if 'POST' == request.method:
      form = PicForm(request.POST, request.FILES)
      if form.is_valid():
          dest = os.path.join(setting.MEDIA_ROOT, username, "default.jpg")
          if os.path.exists(dest):
              os.remove(dest)
          reqfile = form.cleaned_data['pic']
          with open(dest, "wb+") as destination:
          for chunk in reqfile.chunks():
              destination.write(chunk)
          return dest


这样一来,就可以自动区分每个用户的默认头像(default.jpg)了


当然,实现这样保存的方法还有很多,这里只是放出来一种,给大家提点其他的思路了。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值