华人圈关于DjangoAdmin上传文件到七牛云数据和函数库已经是2年前的了,国外的都是关于AWSS3、AzureStorage和一些国外服务的。我基于Django文档中提到的存储系统,实现了简单的上传文件到七牛云的功能。DjangoAdmin中的表单是根据数据模型生成的,其中文件上传由FileField和继承FileField的ImageField决定,文件上传到静态文件目录,数据库保存相对路径。我们根据FileField的存储参数实现上传文件到七牛云。models.ImageField(storage=MyStorage())storage参数需要传入一个实现抽象类Storage的对象。以下引用文件原文。您的自定义存储系统必须是Django.core.files.storage.Storage的子类:fromdjango.confimportsettingsfromdjango.core.files.storageimportStorageclassMyStorage(Storage):def__init__(self,option=None):ifnotoption:option=settings.CUSTOM_STORAGE_OPTIONS...然后重写所有的抽象方法,具体可以去官网文档查看。我们这里不继承Storage。我在Django的核心找到了继承的FileSystemStorage。我觉得只要继承Django标准的文件管理类FileSystemStorage,重载的_save部分就会上传到七牛云。去做就对了。classMyStorage(FileSystemStorage):def_save(self,name,content):#继续原来的写法filename=name.replace('\\','/')#将文件传入封装对象q=Qiniu()q.upload_stream(filename,content.file.getvalue())returnfilename我简单写封装的七牛上传类classQiniu():def__init__(self):self.access_key=settings.QINIU_ACCESS_KEYself.secret_key=settings.QINIU_SECRET_KEY#上传空间self.bucket_name=settings.QINIU_BUCKET_NAME#构建认证对象self.auth=Auth(self.access_key,self.secret_key)defget_token(self,key):""":paramkey:filename:return:uploadtoken"""policy={'scope':settings.QINIU_BUCKET_NAME,'mimeLimit':'image/jpeg;image/png','deadline':3600}#3600为Token过期时间,单位秒.0等于一小时token=self.auth.upload_token(self.bucket_name,key,3600,policy)returntokendefupload_stream(self,filename,stream_data):""":paramfilename:filename:paramstream_data:Binarydata:return:None"""#上传后保存的文件名key=filename#生成上传Token,可以指定过期时间等token=self.auth.upload_token(self.bucket_name,key,3600)#待上传文件的本地路径#localfile=file_pathret,info=put_data(up_token=token,key=key,data=stream_data)assertret['key']==key#assertret['hash']==etag_stream(stream_data)参考:https://docs.djangoproject.co...
