文件上传和下载(文件上传和下载的服务)

网友投稿 344 2022-06-19


一、

settings配置文件中配置

MEDIA_URL = '/media/'

MEDIA_ROOT = os.path.join(BASE_DIR, 'medias').replace('\\', '/')#media即为图片上传的根路径

二、

url路由中配置

urlpatterns = [

url(r'^admin/', admin.site.urls),

url(r'^index/', views.index,name='index'),

] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) #如果单纯的是上传,文件并不用来显示或者读取,就不用加这个

三、

models.py文件中的写法

class Book(models.Model):

name = models.CharField(max_length=32)

date1 = models.DateTimeField(auto_now=True,null=True)

date2 = models.DateTimeField(auto_now_add=True,null=True)

img = models.ImageField(upload_to='img',null=True) #写上upload_to,后面指定一个路径,那么将来上传的文件会直接生成到配置文件中的那个medias文件夹中的img文件夹中,不需要我们自己写读取文件内容写入本地文件的操作,django内部帮我们自动处理了

四、

views视图函数中的写法,上传一个图片:

def index(request):

if request.method == 'POST':

print(request.POST)

username = request.POST.get('username')

print('files',request.FILES)

file_obj = request.FILES.get('file')

models.Book.objects.create(

name=username,

img=file_obj,

) #自动就会将文件上传到我们配置的img文件夹中

return render(request,'index.html')

五、

更新上传了的文件(注意,只是会更新数据库中那个字段保存的文件的路径,但是之前上传的文件是不会被自动删除的,需要我们自行再写逻辑来删除之前上传错的或者需要被覆盖的文件。还有就是如果上传的文件名称是相同的那么你会发现数据库中这个字段的路径后面的文件名称会出现一个乱起八糟的随机字符串,这是因为上传的文件名称冲突了,django为了解决这个冲突,给你改了一下你的文件名称。)

obj = models.Book.objects.get(name='chao2')

obj.img=file_obj

obj.save()

#下面的update方法是不能更新正确更新保存的文件路径的,除非我们自己手动拼接文件路径,然后img=路径来进行update更新

models.Book.objects.filter(name='chao2').update(img=file_obj)

六、

查看已经上传了的文件(就需要借助我们上面在settings配置文件中和url中的配置了)

views.py视图函数的写法:

def index(request):

objs = models.Book.objects.all()

return render(request,'index.html',{'objs':objs})

index.html文件中的写法:

{% for obj in objs %}

{% endfor %}

{% for obj in objs %}

{% endfor %}

下载

在实际的项目中很多时候需要用到下载功能,如导excel、pdf或者文件下载,当然你可以使用web服务自己搭建可以用于下载的资源服务器,如nginx,这里我们主要介绍django中的文件下载。

我们这里介绍三种Django下载文件的简单写法,然后使用第三种方式,完成一个高级一些的文件下载的方法

index.html内容如下

urls.py文件内容如下:

urlpatterns = [

url(r'^index/', views.index,name='index'),

url(r'^download/', views.download,name='download'),

]

view视图函数的写法有一下三种:

方式1:

from django.shortcuts import HttpResponse

def download(request):

file = open('crm/models.py', 'rb') #打开指定的文件

response = HttpResponse(file) #将文件句柄给HttpResponse对象

response['Content-Type'] = 'application/octet-stream' #设置头信息,告诉浏览器这是个文件

response['Content-Disposition'] = 'attachment;filename="models.py"' #这是文件的简单描述,注意写法就是这个固定的写法

return response

注意:HttpResponse会直接使用迭代器对象,将迭代器对象的内容存储城字符串,然后返回给客户端,同时释放内存。可以当文件变大看出这是一个非常耗费时间和内存的过程。而StreamingHttpResponse是将文件内容进行流式传输,数据量大可以用这个方法

方式2:

from django.http import StreamingHttpResponse #

def download(request):

file=open('crm/models.py','rb')

response =StreamingHttpResponse(file)

response['Content-Type']='application/octet-stream'

response['Content-Disposition']='attachment;filename="models.py"'

return response

方式3:

from django.http import FileResponse

def download(request):

file=open('crm/models.py','rb')

response =FileResponse(file)

response['Content-Type']='application/octet-stream'

response['Content-Disposition']='attachment;filename="models.py"'

return response

三种

三种http响应对象在django官网都有介绍.入口:https://docs.djangoproject.com/en/1.11/ref/request-response/

推荐使用FileResponse,从源码中可以看出FileResponse是StreamingHttpResponse的子类,内部使用迭代器进行数据流传输。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:用python暴力破解压缩文件并不是万能,至少这个场景我告诉你密码你用代码也破
下一篇:什么是ASCII码
相关文章

 发表评论

暂时没有评论,来抢沙发吧~