s3对象存储
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对象存储的更多相关文章
- Golang 调用 aws-sdk 操作 S3对象存储
Golang 调用 aws-sdk 操作 S3对象存储 前言 因为业务问题,要写一个S3对象存储管理代码,由于一直写Go,所以这次采用了Go,Go嘛,快,自带多线程,这种好处就不用多说了吧. 基础的功 ...
- 【系统设计】S3 对象存储
在本文中,我们设计了一个类似于 Amazon Simple Storage Service (S3) 的对象存储服务.S3 是 Amazon Web Services (AWS) 提供的一项服务, 它 ...
- ceph 007 双向池同步 rgw对象网关配置 s3对象存储
增量导入导出要基于快照 导出的过程当中害怕镜像被修改所以打快照.快照的数据是不会变化的 镜像级别的双向同步 镜像主到备,备到主.一对一 就算是池模式的双向同步,镜像也具有主备关系 双向同步,池模式 [ ...
- 使用s3fs-fuse 挂载minio s3 对象存储
minio 是一个aws s3 兼容的对象存储系统,我们可以通过s3fs 进行数据桶的挂载,这样可以做好多方便的事情 环境准备 使用docker-compose 运行 minio docker-com ...
- 【Python】使用 boto 调用 S3 对象存储API
代码示例: import logging #from django.conf import settings import boto from boto.s3.key import Key impor ...
- AWS S3 对象存储服务
虽然亚马逊云非常牛逼,虽然亚马逊云财大气粗,虽然亚马逊用的人也非常多,可是这个文档我简直无法接受,特别是客服,令人发指的回复速度,瞬间让人无语,可是毕竟牛逼.忍了,躺一次坑而已 1.图片上传 1.1 ...
- 010 Ceph RGW对象存储
一.对象存储 1.1 介绍 通过对象存储,将数据存储为对象,每个对象除了包含数据,还包含数据自身的元数据 对象通过Object ID来检索,无法通过普通文件系统操作来直接访问对象,只能通过API来访问 ...
- FreeNAS 11.0 正式发布,提供 S3 兼容的对象存储服务
FreeNAS 11.0 正式版已发布,该版本带来了新的虚拟化和对象存储功能.FreeNAS 11.0 将 bhyve 虚拟机添加到其受欢迎的 SAN / NAS.Jail 和插件中,让用户可以在 F ...
- 基于LAMP php7.1搭建owncloud云盘与ceph对象存储S3借口整合案例
ownCloud简介 是一个来自 KDE 社区开发的免费软件,提供私人的 Web 服务.当前主要功能包括文件管理(内建文件分享).音乐.日历.联系人等等,可在PC和服务器上运行. 简单来说就是一个基于 ...
随机推荐
- 第三章 SqlSessionFactoryBean(MyBatis)
SqlSessionFactoryBean 在基本的 MyBatis 中,session 工厂可以使用 SqlSessionFactoryBuilder 来创建.而在 MyBatis-Spring 中 ...
- 完美解决jQuery符号$与其他javascript 库、框架冲突的问题
目前有大量的 javascript 开发框架,其中有一部分使用 $ 作为调用符号,这可能导致相互之间的冲突,而 jQuery 为解决这个问题,可以在 jQuery 导入时放弃 $ 使用权,届时 $ 则 ...
- C++与Java混合编程
现在的程序员,不再像以前一样,掌握一种编程语言就可以混得有模有样了,现实的情况是,真实的项目中,通常是涉及多种编程语言,举几个简单的例子,一个软件为了快速开发,可能是使用Delphi或VB作为界面开发 ...
- [转]ASP.NET MVC 5 - 将数据从控制器传递给视图
在我们讨论数据库和数据模型之前,让我们先讨论一下如何将数据从控制器传递给视图.控制器类将响应请求来的URL.控制器类是给您写代码来处理传入请求的地方,并从数据库中检索数据,并最终决定什么类型的返回结果 ...
- layui时间,table,大图查看,弹出框,获取音频长度,文件上传
1.引入: <link href="../../Scripts/layui-v2.3.0/css/layui.css" rel="stylesheet" ...
- day21<IO流+&FIle递归>
IO流(字符流FileReader) IO流(字符流FileWriter) IO流(字符流的拷贝) IO流(什么情况下使用字符流) IO流(字符流是否可以拷贝非纯文本的文件) IO流(自定义字符数组的 ...
- 九度 1481 Is It A Tree?
题目 给定一个有向图, 判断其是否是一棵树 要求 (1) 除了根节点外, 每个节点只有唯一的前驱 (2) 从根节点出发, 到任何节点有且只有一条路径 思路 1. 要求(1) 可以通过记录每个节点的前驱 ...
- POJ 1243 One Person
题意: 猜数字, 给定 G, L, G 表示可以猜的次数, 每猜一次, G减一, 假如猜的 number 大于 target, L 还需减一, 当 L == -1 或者 G==0 时, 若还没猜中, ...
- 件测试专家分享III GUI自动化测试相关
GUI自动化:效率为王—脚本与数据解偶 页面对象模型的核心理念是,以页面(Web Page或者Native App Page)为单位来封装页面上的空间以及控件部分操作. 而测试用力,更确切的说是操作函 ...
- Dubbo源码导入Eclipse遇到的问题
1.怎么将Dubbo源码导入到Eclipse 方法一: 打开Eclipse,File-->Import-->maven-->Exsting Maven Projects,选择dubb ...