django上傳文件至 阿里雲OSS

1.阿里雲OSS

創建用於測試的Bucket
測試的Bucket名稱:test–space
讀寫權限根據自己需求(這裏我設置的如下)
在這裏插入圖片描述在這裏插入圖片描述

2. 獲取Access Key

可以在RAM訪問控制中創建一個用戶賦予只是對OSS管理的權限
RAM訪問控制:https://ram.console.aliyun.com/overview
在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

3.Django配置

  1. 創建Django項目
  2. 創建自己測試的app

主要文件內容
url.py

from django.contrib import admin
from django.urls import path
# 測試app爲up_to_oss
from up_to_oss.views import index,test

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',index),
    path('test',test,name='test'),

]

views.py
注意:將(‘AccessKeyId’, ‘AccessKeySecret’)改成自己獲取的

import uuid
from django.http import HttpResponse
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
import oss2

# 用戶賬號密碼,第三部說明的Access
# 阿里雲主賬號AccessKey擁有所有API的訪問權限,風險很高。強烈建議您創建並使用RAM賬號進行API訪問或日常運維,請登錄 https://ram.console.aliyun.com 創建RAM賬號。
# 獲取的AccessKey
auth = oss2.Auth('AccessKeyId', 'AccessKeySecret')
# 這個是需要用特定的地址,不同地域的服務器地址不同,不要弄錯了
endpoint = 'http://oss-cn-beijing.aliyuncs.com'
# 你的項目名稱,類似於不同的項目上傳的圖片前綴url不同
# 因爲我用的是ajax傳到後端方法接受的是b字節文件,需要如下配置。 阿里雲oss支持更多的方式,下面有鏈接可以自己根據自己的需求去寫
bucket = oss2.Bucket(auth, endpoint, 'test--space')  # 項目名稱

# 這個是上傳圖片後阿里雲返回的uri需要拼接下面這個url纔可以訪問,根據自己情況去寫這步
base_file_url = 'https://test--space.oss-cn-beijing.aliyuncs.com/'



# Create your views here.
def index(request):
    return render(request,'index.html')

# 進度條
# 當無法確定待上傳的數據長度時,total_bytes的值爲None。
def percentage(consumed_bytes, total_bytes):
    if total_bytes:
        rate = int(100 * (float(consumed_bytes) / float(total_bytes)))
        print('\r{0}% '.format(rate), end='')


def update_fil_file(file):
    """
    ! 上傳單張圖片
    :param file: b字節文件
    :return: 若成功返回圖片路徑,若不成功返回空
    """
    # 生成文件編號,如果文件名重複的話在oss中會覆蓋之前的文件
    number = uuid.uuid4()
    # 生成文件名
    base_fil_name = str(number) + '.mp4'
    # 生成外網訪問的文件路徑
    file_name = base_file_url + base_fil_name
    # 這個是阿里提供的SDK方法 bucket是調用的4.1中配置的變量名
    res = bucket.put_object(base_fil_name, file, progress_callback=percentage)
    # 如果上傳狀態是200 代表成功 返回文件外網訪問路徑
    # 下面代碼根據自己的需求寫
    if res.status == 200:
        return file_name
    else:
        return False

@csrf_exempt
def test(request):
    if request.method == 'POST':
        # 獲取前端ajax傳的文件 使用read()讀取b字節文件
        file = request.FILES.get('file').read()
        # 通過上面封裝的方法把文件上傳
        file_url = update_fil_file(file)
        print(file_url)
        # 這裏沒有做判斷驗證只是測試代碼 根據自己的需求需要判斷
        return HttpResponse('上傳成功')

index.html

<!DOCTYPE html>
<html>
<head>
    <script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script>
</head>
<body>
<div class="col-md-6">
    <!-- 這裏一定要把type寫進去,如果你要限定上傳的類型加上accept='' (我上傳的是視頻文件)-->
    <p>上傳視頻</p>
    <input type="file" name="myfile" id="i1" accept="video/*" class="btn btn-primary">
    <button id="d1" class="btn btn-success">提交~</button>
</div>
<script>
    $(function () {
        $('#d1').click(function () {
            var formdata = new FormData();
            formdata.append('file', $('#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>
</body>
</html>

4.測試結果

在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述完成。

發佈了16 篇原創文章 · 獲贊 4 · 訪問量 3890
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章