django连接阿里云oss
1.首先购买阿里云oss
详细内容请参考[阿里云官网](https://oss.console.aliyun.com/overview)
2.进入控制台创建项目,配置基础设置
这个地方选择公共读写,否则上传的图片返回的url是需要密钥才可以访问的。这个看自己的需求进行更改
3. 获取Access Key
在oss管理页面查看账号密码,这个需要在python代码请求oss上传文件时用到的。
4. python代码
4.1 配置
import oss2
# 用户账号密码,第三部说明的Access
auth = oss2.Auth(ali_oss['AccessKeyId'], ali_oss['AccessKeySecret'])
# 这个是需要用特定的地址,不同地域的服务器地址不同,不要弄错了
endpoint = 'http://oss-cn-beijing.aliyuncs.com'
# 你的项目名称,类似于不同的项目上传的图片前缀url不同
# 因为我用的是ajax传到后端方法接受的是b字节文件,需要如下配置。 阿里云oss支持更多的方式,下面有链接可以自己根据自己的需求去写
bucket = oss2.Bucket(auth, endpoint, 'hling') # 项目名称
# 这个是上传图片后阿里云返回的uri需要拼接下面这个url才可以访问,根据自己情况去写这步
base_image_url = 'https://hling.oss-cn-beijing.aliyuncs.com/'
阿里云oss提供的几种简单上传支持类型
类型 | 上传方式 |
---|---|
字符串 | 直接上传 |
Bytes | 直接上传 |
Unicode | 自动转换为UTF-8编码的Bytes进行上传 |
本地文件 | 文件对象(File Object),必须以二进制方式打开(如“rb”模式) |
网络流 | 可迭代对象(Iterable),以Chunked Encoding的方式上传 |
参考文档
4.2 调用
def update_img_file(image):
"""
! 上传单张图片
:param image: b字节文件
:return: 若成功返回图片路径,若不成功返回空
"""
# 生成文件编号,如果文件名重复的话在oss中会覆盖之前的文件
number = uuid.uuid4()
# 生成文件名
base_img_name = str(number) + '.jpg'
# 生成外网访问的文件路径
image_name = base_image_url + base_img_name
# 这个是阿里提供的SDK方法 bucket是调用的4.1中配置的变量名
res = bucket.put_object(base_img_name, image)
# 如果上传状态是200 代表成功 返回文件外网访问路径
# 下面代码根据自己的需求写
if res.status == 200:
return image_name
else:
return False
5.后端代码
@csrf_exempt
def test(request):
print(request.POST.get('test'))
# 获取前端ajax传的文件 使用read()读取b字节文件
image = request.FILES.get('image').read()
# 通过上面封装的方法把文件上传
image_url = update_img_file(image)
# 这里没有做判断验证只是测试代码 根据自己的需求需要判断
return HttpResponse('上传成功')
6.前端代码
<div class="col-md-6">
<!-- 这里一定要把type写进去,如果你要限定上传的类型加上accept='' -->
<input type="file" name="myfile" id="i1" accept="image/*" class="btn btn-primary">
<button id="d1" class="btn btn-success">提交~</button>
</div>
<script>
$('#d1').click(function () {
var formdata = new FormData();
formdata.append('image', $('#i1')[0].files[0]);
$.ajax({
url: '{% url 'test' %}', // 这里是在django的urls中配置的反向解析路由,可以通过name='test' 访问test这个指向的路由
type: 'post',
data: formdata,
// ajax发送文件需要修改两个固定的参数
processData: false, // 告诉浏览器不要处理我的数据
contentType: false, // 不要用任何的编码,就用我formdata自带的编码格式,django能够自动识别改formdata对象
// 回调函数
success: function (data) {
alert(data)
}
})
})
</script>
7. 效果
hling 这个是代表我的oss仓库名
8. 总结
自己想搭建一个个人网站,需要上传一些图片,但是自己的服务器配置很低,如果都存在本地的话那么请求大图会很卡,本来想使用七牛云的,但是需要身份认证一天的时间,就直接用的阿里云的oss。好像七牛云有免费的空间,如果是个人学习使用没有必要买oss这个服务。
新人小白 如果哪里有问题欢迎大家指正