## 一、上傳到本地
### 準備工作:
models中創建表:
~~~
class Book(models.Model):
name = models.CharField(
max_length=40
)
icon = models.ImageField(
upload_to="icons" # 指定文件保存的路徑名 系統自動創建
)
~~~
settings中配置存儲路徑
~~~
MEDIA_ROOT = os.path.join(BASE_DIR, "static/uploads")
~~~
生成一個不重復的文件名:
~~~
import uuid,hashlib
def get_unique_str():
uuid_str = str(uuid.uuid4())
md5 = hashlib.md5()
md5.update(uuid_str.encode('utf-8'))
return md5.hexdigest()
~~~
### 方法一(文件保存到本地和數據庫):
views視圖中的寫法:
~~~
def test1(req):
if req.method == 'GET':
return render(req, 'mybook.html',{'book_name':book.name,'icon':icon_url})
name = req.POST.get('name')
myfile = req.FILES.get('icon')
book = Book.objects.create(name=name,icon=myfile) #將數據存儲到Book表中
return HttpResponse('OK')
~~~
前端頁面寫法:
~~~
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/app/test1/" method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="text" name="name" placeholder="書名"><br>
<input type="file" name="icon"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
~~~
拼接圖片的網絡路徑,可通過該路徑在瀏覽器上顯示出圖片
~~~
icon_url = "http://{}/static/uploads/{}".format(
req.get_host(), #獲取訪問的域名加端口
book.icon.url #圖片的路徑字符串
)
~~~
### 方法二(文件保存到本地):
views視圖中的寫法:
~~~
from .myutil import get_unique_str
~~~
~~~
def test2(req):
if req.method == 'GET':
return render(req,'mybook.html')
else:
name = req.POST.get('name')
myfile = req.FILES.get('icon')
filename = get_unique_str()+'.'+myfile.name.split('.')[-1]
# 文件路徑
filepath = os.path.join(settings.MEDIA_ROOT,filename)
f = open(filepath,'wb')
for i in myfile.chunks():
f.write(i)
f.close()
return HttpResponse('OK')
~~~
前端頁面的寫法:
~~~
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/app/test2/" method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="text" name="name" placeholder="書名"><br>
<input type="file" name="icon"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
~~~
## 二、上傳到oss(\*\*\*)
進入阿里云OSS管理控制臺,找到配置信息
views視圖中的寫法
~~~
import oss2
from io import BytesIO
def upload_to_oss(req):
if req.method == 'GET':
return render(req,'mybook.html')
# 將找到的信息填入下面空缺處
endpoint = ''
access_key_id = ''
access_key_secret = ''
bucket_name = ''
bucket_name_host = ""
# 生成一個認證對象
auth = oss2.Auth(access_key_id, access_key_secret)
bucket = oss2.Bucket(auth, endpoint, bucket_name)
# 獲取文件
f = req.FILES.get("icon")
# 實例化io
buf = BytesIO()
# 寫入到內存
for i in f.chunks():
buf.write(i)
# 調整指針到開頭
buf.seek(0)
# 上傳
filename = get_unique_str() + "." + f.name.split(".")[-1]
bucket.put_object(filename, buf.getvalue())return HttpResponse('ok')
~~~
?前端頁面寫法:
~~~
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/app/upload_to_oss/" method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="text" name="name" placeholder="書名"><br>
<input type="file" name="icon"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
~~~
圖片最終會被上傳到阿里云OSS管理控制臺中你選擇的bucket的文件管理中。
- Python學習
- Python基礎
- Python初識
- 列表生成式,生成器,可迭代對象,迭代器詳解
- Python面向對象
- Python中的單例模式
- Python變量作用域、LEGB、閉包
- Python異常處理
- Python操作正則
- Python中的賦值與深淺拷貝
- Python自定義CLI三方庫
- Python并發編程
- Python之進程
- Python之線程
- Python之協程
- Python并發編程與IO模型
- Python網絡編程
- Python之socket網絡編程
- Django學習
- 反向解析
- Cookie和Session操作
- 文件上傳
- 緩存的配置和使用
- 信號
- FBV&&CBV&&中間件
- Django補充
- 用戶認證
- 分頁
- 自定義搜索組件
- Celery
- 搭建sentry平臺監控
- DRF學習
- drf概述
- Flask學習
- 項目拆分
- 三方模塊使用
- 爬蟲學習
- Http和Https區別
- 請求相關庫
- 解析相關庫
- 常見面試題
- 面試題
- 面試題解析
- 網絡原理
- 計算機網絡知識簡單介紹
- 詳解TCP三次握手、四次揮手及11種狀態
- 消息隊列和數據庫
- 消息隊列之RabbitMQ
- 數據庫之Redis
- 數據庫之初識MySQL
- 數據庫之MySQL進階
- 數據庫之MySQL補充
- 數據庫之Python操作MySQL
- Kafka常用命令
- Linux學習
- Linux基礎命令
- Git
- Git介紹
- Git基本配置及理論
- Git常用命令
- Docker
- Docker基本使用
- Docker常用命令
- Docker容器數據卷
- Dockerfile
- Docker網絡原理
- docker-compose
- Docker Swarm
- HTML
- CSS
- JS
- VUE