〇、前言
檔案上傳/下載介面與普通介面類似,但是有細微的區別。
如果需要傳送檔案到伺服器,例如:上傳文件、圖片、視訊等,就需要傳送二進位制資料,上傳檔案一般使用的都是 Content-Type: multipart/form-data
資料型別,可以傳送檔案,也可以傳送相關的訊息體資料。
反之,檔案下載就是將二進位制格式的響應內容儲存到本地,並根據需要下載的檔案的格式來寫檔名,例如:F:/合同檔案.pdf。
一、檔案上傳介面
1. 介面文件
Request URL: /createbyfile
Request Method: POST
Content-Type: multipart/form-data
名稱 | 型別 | 是否必須 | 描述 |
---|---|---|---|
file | File | 是 | 文件檔案 |
title | String | 是 | 文件名稱 |
fileType | String | 是 | 檔案型別:doc, docx, txt, pdf, png, gif, jpg, jpeg, tiff, html, rtf, xls, txt |
2. 程式碼實現
(1)實現步驟:
-
構造檔案資料,通過open函式以二進位制方式開啟檔案
檔案上傳介面引數與普通post請求一樣,需要寫成Key和Value模式,Key為引數名稱file(也是元件的name屬性),Value為一個元組(與普通介面不同的地方)
"file": ( "", # 元組第一個值為檔名稱,沒有則取None open(r"F:\pdf_file.pdf", "rb"), # 若第一個值非None,則取檔案open開啟的二進位制流,否則直接寫檔案路徑,如"F:\pdf_file.pdf" "pdf" # 檔案型別 )
"file": ( None, "F:\pdf_file.pdf" )
-
構造其他資料
{ "title": "介面發起的文件", "fileType": "pdf" }
-
傳送請求,將檔案資料以
files
引數傳入,其他訊息體資料通過data
、json
、headers
、cookies
等傳入req = { "url": "127.0.0.1/v2/document/createbyfile", "method": "POST", "headers": {}, "files": {"file": ("", open(r"F:\pdf_file.pdf", "rb"), "pdf")}, "data": { "title": "介面發起的文件", "fileType": "pdf" } }
(2)完整程式碼
base_api.py
import requests
class BaseApi:
@staticmethod
def requests_http(req):
# ** 解包
result = requests.request(**req)
return result
api/createbyfile.py
# -*- coding:utf-8 -*-
# 作者:IT小學生蔡坨坨
# 時間:2022/3/12 21:04
# 功能:根據檔案型別建立合同文件
from base_api import BaseApi
class Createbyfile:
def createbyfile(self):
req = {
"url": "127.0.0.1/createbyfile",
"method": "POST",
"headers": {},
"files": {"file": ("", open(r"F:\pdf_file.pdf", "rb"), "pdf")},
"data": {
"title": "介面發起的文件",
"fileType": "pdf"
}
}
res = BaseApi().requests_http(req)
assert res.status_code == 200
res_json = res.json()
return res_json["result"]["documentId"]
if __name__ == '__main__':
Createbyfile().createbyfile()
二、檔案下載介面
1. 介面文件
Request URL:/download
Request Method:GET
名稱 | 型別 | 是否必須 | 描述 |
---|---|---|---|
contractId | Long | ID | ID |
downloadItems | String[] | 否 | 下載可選項,NORMAL(正文),ATTACHMENT(附件) |
needCompressForOneFile | Boolean | 是,預設單檔案也壓縮 | 當下載的檔案僅一份時,是否壓縮 |
2. 程式碼實現
# -*- coding:utf-8 -*-
# 作者:IT小學生蔡坨坨
# 時間:2022/4/5 2:56
# 功能:下載合同
from base_api import BaseApi
class Download:
def download(self):
req = {
"url": "127.0.0.1/download",
"method": "GET",
"headers": {},
"params": {
"contractId": 2947403075747869536,
"downloadItems": ["NORMAL"],
"needCompressForOneFile": False
},
}
res = BaseApi().requests_http(req).content # 注意“.content"獲取返回內容
# with open("F:/response.zip", "wb") as f:
with open("F:/response.pdf", "wb") as f:
f.write(res)
return res
if __name__ == '__main__':
Download().download()