django 上傳文件 至 阿里雲OSS
1.阿里雲OSS
創建用於測試的Bucket
測試的Bucket名稱:test–space
讀寫權限根據自己需求(這裏我設置的如下)
2. 獲取Access Key
可以在RAM訪問控制中創建一個用戶賦予只是對OSS管理的權限
RAM訪問控制:https://ram.console.aliyun.com/overview
3.Django配置
- 創建Django項目
- 創建自己測試的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.測試結果
完成。