bkstorages 模块帮助你在蓝鲸应用中使用多种文件存储服务作为后端,用于加速静态资源,管理用户上传文件。

自定静态文件 storage

如果通过修改配置文件满足不了你的需求,你随时可以通过继承 RGWBoto3Storage 的方式来自定义你自己的 storage:

class MyStaticRGWBoto3Storage(RGWBoto3Storage):
"""My Storage class for storing static files
"""
bucket_name = 'another_bucket'
location = '/my_static_path'
object_parameters = {
'Expires': 'Wed, 30 Nov 2016 04:12:29 GMT',
'CacheControl': 'max-age=86400'
}

# 修改 settings
STATICFILES_STORAGE = 'custom_backend.MyStaticRGWBoto3Storage'

除了将 RGWBoto3Storage 指定为文件存储后端外,你还可以通过 RGWBoto3Storage API 来手动使用它来管理文件。

上传内容文件:

from bkstorages.backends.rgw import RGWBoto3Storage

storage = RGWBoto3Storage()

# 使用 ContentFile
f = ContentFile('Hello, RGW!')
storage.save(u'/test/hello', f)
上传文件对象:

from tempfile import NamedTemporaryFile

from django.core.files import File

with NamedTemporaryFile() as fp:
fp.write('Temp file')
fp.flush()

f = File(fp)
storage.save(u'/test/temp_file.txt', f)
查看文件链接:

storage.url('/test/temp_file.txt')
列出目录下所有文件:

storage.listdir('/test')
删除文件:

storage.delete('/test/temp_file.txt')


from bkstorages.backends.rgw import RGWBoto3Storage
storage = RGWBoto3Storage()
def task_file_upload(request):
random_str = ''.join(random.sample(string.ascii_lowercase, 8))
upload_dir = "%s/task_data/tmp/%s" % (FileUploadDir, random_str)
response_dic = {'files': {}}
user = request.COOKIES.get('bk_uid')
l, l1, l2 = [], [], []
l.append(user)
l.sort(cmp)
user_list = Users.objects.values('username')
for i in user_list:
username = i.get('username')
l1.append(username)
l1.sort(cmp)
a = list(set(l) - set(l1))
if a:
Users(username=a[0]).save()
user_name = Users.objects.get(username=user)
for k, file_obj in request.FILES.items():
filename = '%s/%s' % (upload_dir, file_obj.name)
with NamedTemporaryFile() as destination:
for chunk in file_obj.chunks():
destination.write(chunk)
f = File(destination)
storage.save(filename, f)
size = storage.size(filename)
ctime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))
FileList(file_name=file_obj.name, file_size=size, file_create_time=ctime, user=user_name, files_dir=random_str).save()
filelist = FileList.objects.filter(user=user_name)
for file in filelist:
response_dic['files'][file.id] = {'file_name': file.file_name, 'user': file.user.username, 'file_create_time': file.file_create_time, 'file_size': file.file_size, 'files_dir': file.files_dir}
return HttpResponse(json.dumps(response_dic)) def delete_file(request, random_str):
response, file_abs = {}, ''
if request.method == "POST":
upload_dir = "%s/task_data/tmp/%s" % (FileUploadDir, random_str)
filename = request.POST.get('filename')
file_id = request.POST.get('fileid')
if filename and file_id:
file_abs = "%s/%s" % (upload_dir, filename.strip())
if storage.exists(file_abs):
storage.delete(file_abs)
FileList.objects.filter(id=file_id).delete()
response['msg'] = "file '%s' got deleted " % filename
else:
response["error"] = "file '%s' does not exist on server" % filename
return HttpResponse(json.dumps(response)) def send_zipfile(request, file_path, file_name):
zip_file_name = '%s_files' % file_name
archive = zipfile.ZipFile(zip_file_name, 'w', zipfile.ZIP_DEFLATED)
file__name = file_name.encode('utf-8')
filepath = storage.url('%s/%s' % (file_path, file__name.strip()))
file_path = urllib.unquote(filepath.encode('utf-8'))
bash('curl -O %s' % file_path)
if os.path.isfile(file__name):
archive.write(file__name, arcname=file__name)
archive.close()
wrapper = FileWrapper(open(zip_file_name, 'rb'))
response = HttpResponse(wrapper, content_type='application/zip')
response['Content-Disposition'] = 'attachment; filename=%s.zip' % (urlquote(zip_file_name))
response['Content-Length'] = os.path.getsize(zip_file_name)
return response def file_download(request, random_str):
file_path, file_name = '', ''
if request.method == "POST":
file_path = "%s/task_data/tmp/%s" % (FileUploadDir, random_str)
file_name = request.POST.get('filename')
return send_zipfile(request, file_path, file_name)

s3对象存储的更多相关文章

  1. Golang 调用 aws-sdk 操作 S3对象存储

    Golang 调用 aws-sdk 操作 S3对象存储 前言 因为业务问题,要写一个S3对象存储管理代码,由于一直写Go,所以这次采用了Go,Go嘛,快,自带多线程,这种好处就不用多说了吧. 基础的功 ...

  2. 【系统设计】S3 对象存储

    在本文中,我们设计了一个类似于 Amazon Simple Storage Service (S3) 的对象存储服务.S3 是 Amazon Web Services (AWS) 提供的一项服务, 它 ...

  3. ceph 007 双向池同步 rgw对象网关配置 s3对象存储

    增量导入导出要基于快照 导出的过程当中害怕镜像被修改所以打快照.快照的数据是不会变化的 镜像级别的双向同步 镜像主到备,备到主.一对一 就算是池模式的双向同步,镜像也具有主备关系 双向同步,池模式 [ ...

  4. 使用s3fs-fuse 挂载minio s3 对象存储

    minio 是一个aws s3 兼容的对象存储系统,我们可以通过s3fs 进行数据桶的挂载,这样可以做好多方便的事情 环境准备 使用docker-compose 运行 minio docker-com ...

  5. 【Python】使用 boto 调用 S3 对象存储API

    代码示例: import logging #from django.conf import settings import boto from boto.s3.key import Key impor ...

  6. AWS S3 对象存储服务

    虽然亚马逊云非常牛逼,虽然亚马逊云财大气粗,虽然亚马逊用的人也非常多,可是这个文档我简直无法接受,特别是客服,令人发指的回复速度,瞬间让人无语,可是毕竟牛逼.忍了,躺一次坑而已 1.图片上传 1.1 ...

  7. 010 Ceph RGW对象存储

    一.对象存储 1.1 介绍 通过对象存储,将数据存储为对象,每个对象除了包含数据,还包含数据自身的元数据 对象通过Object ID来检索,无法通过普通文件系统操作来直接访问对象,只能通过API来访问 ...

  8. FreeNAS 11.0 正式发布,提供 S3 兼容的对象存储服务

    FreeNAS 11.0 正式版已发布,该版本带来了新的虚拟化和对象存储功能.FreeNAS 11.0 将 bhyve 虚拟机添加到其受欢迎的 SAN / NAS.Jail 和插件中,让用户可以在 F ...

  9. 基于LAMP php7.1搭建owncloud云盘与ceph对象存储S3借口整合案例

    ownCloud简介 是一个来自 KDE 社区开发的免费软件,提供私人的 Web 服务.当前主要功能包括文件管理(内建文件分享).音乐.日历.联系人等等,可在PC和服务器上运行. 简单来说就是一个基于 ...

随机推荐

  1. SharePoint Server 2013 通过IP无法访问站点

    通过IP访问SharePoint站点,出现“The Web application at http://172.21.19.132:1000 could not be found.... ”如下错误: ...

  2. TFS对签入文件忽略设置,解决pdb弹出警告

    我们在使用TFS项目老是出现冲突,要么编译的时候 提示PDB被签出这类的大量弹出,很烦人. 在群友的指点下,对签入文件进行限制.对PDB禁止签入以后,整个世界安静了.非常感谢 TFS=>服务器管 ...

  3. 【java】java 设计模式(4):建造者模式(Builder)

    工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到 ...

  4. android学习之--网格视图(GridView)和图像切换器(ImageSwitcher)

             GridView用于在界面上按行.列分布显示多个组件.GridView和ListView有共同父类:AbsListView. GridView与ListView的差别在于:ListV ...

  5. 用cocos2d 2.1制作一个过河小游戏(4): 游戏主逻辑BaseLayer设计

    前段时间一直在忙.没有时间更新博客.今天还是抽点时间把最后一小部分游戏的实现放上来吧. BaseLayer.h: #import <GameKit/GameKit.h> #import & ...

  6. C语言函数參数传递原理

    C语言中參数的传递方式一般存在两种方式:一种是通过栈的形式传递.还有一种是通过寄存器的方式传递的. 这次.我们仅仅是具体描写叙述一下第一种參数传递方式,第二种方式在这里不做具体介绍. 首先,我们看一下 ...

  7. Hash表(hash table ,又名散列表)

    直接进去主题好了. 什么是哈希表? 哈希表(Hash table,也叫散列表),是根据key而直接进行访问的数据结构.也就是说,它通过把key映射到表中一个位置来访问记录,以加快查找的速度.这个映射函 ...

  8. Hbase的基本认识

    1.使用场景:实时查询交互 说说概念性的东西,方便今后更加深入的理解. HBase是Apache Hadoop中的一个子项目,Hbase依托于Hadoop的HDFS作为最基本存储基础单元,通过使用ha ...

  9. #pragam预处理分析

    #pragma是编译器指示字,用域指示编译器完成一些特定动作, #pragma所定义的很多指示字是编译器和操作系统特有的 #pragma在不同的编译器间是不可移植的 预处理器将忽略它不认识的#prag ...

  10. NUC131演示如何通过PWM触发ADC。

    今天我来讲讲PWM触发ADC的例程 /**************************************************************************** * @f ...