python django 上传图片到阿里云oss

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这个服务。

新人小白 如果哪里有问题欢迎大家指正

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值