2019独角兽企业重金招聘Python工程师标准>>>
提供文件上传接口
代码实例
- UploadView类提供了文件上传的方法
class UploadView(APIView):
'''
上传文件接口
'''
parser_classes = (MultiPartParser,)
def post(self, request, format=None):
code = 0
msg = 'fail'
#生成本次上传的版本号可根据需要控制精度
accessory_v = datetime.now().strftime('%Y')
# 获取多个file
files = request.FILES.getlist('file', None)
type = request.POST['type']
for file_obj in files:
# 将文件缓存到本地后上传
local_file = local_file_path + '/' + file_obj.name
# 读取传入的文件
destination = open(filename, 'wb+')
for chunk in file_obj.chunks():
# 写入本地文件
destination.write(chunk)
destination.close()
#拼接成S3服务器文件存放的地址
myobject_name = '/' + type + '/'+ accessory_v + '/'+ file_obj.name
# 上传至S3服务器
s = S3Manager()
f = s.upload(myobject_name, filename)
if f != []:
code=1
msg='success'
return Response(
{
"code": code,
"message": msg,
}
)
注:当使用parser_classes = (MultiPartParser,)这种方式上传附件时,客户端请求请求头不能有Content-Type,否则会报错
- S3Manager类提供对S3服务器文件的上传和下载功能,这里使用的是Minio存储服务,第三方的包为minio
pip3 install minio
class S3Manager(object):
"""
提供s3文件的上传和下载功能
"""
def __init__(self):
"""
构造函数,初始化一个客户端
"""
minioClient = Minio(settings.AWS_BUCKET_HOST, access_key=settings.AWS_ACCESS_KEY,
secret_key=settings.AWS_SECRET_KEY, secure=None)
self.minioClient = minioClient
def getFullObject(self, myobject_name, tempobject):
"""
:param myobject_name: S3服务器上的文件
:param tempobject: 生成本地上的文件
:return:
"""
try:
self.minioClient.fget_object(settings.AWS_BUCKET_NAME, myobject_name, tempobject)
except ResponseError as err:
logger.error(err)
def upload(self, myobject_name, file):
"""
:param myobject_name: 存放到S3服务器上的文件,也包括路径哟
:param file:本地服务器上的文件
:return:etag上传后生成的文件ID,url上传后生成文件下载的URL
"""
try:
with open(file, 'rb') as file_data:
file_stat = os.stat(file)
etag = self.minioClient.put_object(settings.AWS_BUCKET_NAME, myobject_name, file_data,
file_stat.st_size)
url = self.getUrl(myobject_name)
return etag, url
except ResponseError as err:
logger.error(err) # 异常写入error日志
return False
def getUrl(self, myobject_name):
"""
:param myobject_name:存放到S3服务器上的文件 也包括路径哟
:return: 生成的文件下载的URL地址,有效期为两天
"""
try:
url = self.minioClient.presigned_get_object(settings.AWS_BUCKET_NAME, myobject_name,
expires=timedelta(days=2))
except ResponseError as err:
logger.error(err)
return url
使用minio更多操作大家可以官网查看