1、在网站中,上传附件前端使用的框架,很多时候无法告诉你,具体的逻辑是什么样的。那么就需要自己分析具体的逻辑是什么样的。
首先,可以抓包查看当前上传文件的接口,例如:
【请求头信息】
POST /XXXX/uploadFileToServer HTTP/1.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryexIQgEmJ4kPcGKob
Accept: */*
Accept-Language: zh-CN,zh-Hans;q=0.9
Accept-Encoding: gzip, deflate
Host: 172.1.1.1:8080
Origin: http://172.1.1.1:8080
Content-Length: 875890
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Safari/605.1.15
Referer: http://172.1.1.1:8080/index.html
Connection: keep-alive
timestamp: 1654078585604
X-Requested-With: XMLHttpRequest
signature: e5555f052c6939ed897fd08bc2e45445720b8b1c08c235d2b11b53b4acd18954
x-auth-token: yJpZCI6InFpaC54aWUiLCJ1c2VyIjoie1widXNlclwiOntcImRlcHROb1wiOlwiMDAzNjFcIixcImlzU2FsZXNcIjoxLFwibGFzdExvZ2luVGltZVwiOlwiMjAyMjA2MDExODEyMjBcIixcIm1vZGlQd2RGb3JjZVwiOlwiMVwiLFwicHdkRXhwaXJlRGF0ZVwiOlwiMjAyMi0wOC0wMVwiLFwicHdkVHJ5VGltZXNcIjpcIjBcIixcInVzZXJOYW1lXCI6XCLop6PlpYfmmIpcIixcInVzZXJOb1wiOlwicWloLnhpZVwiLFwidXNlclN0YXRlXCI6XCIxXCJ9fSIsImp0aSI6InFpaC54aWUiLCJpc3MiOiJxaWgueGllIiwiaWF0IjoxNjU0MDc4MzQwLCJleHAiOjE2NTQwODE5NDB9.zQZntgqeNh-dCJf6SqgxzVuTytaO-RRpE5c3PiNRvvA
【body参数】
------WebKitFormBoundaryexIQgEmJ4kPcGKob
Content-Disposition: form-data; name="file"; filename="QQ图片20141222110806.jpg"
Content-Type: image/jpeg
------WebKitFormBoundaryexIQgEmJ4kPcGKob--
分析:
(1)携带了token,说明是登录状态
(2)文件流的形式传递给服务器
具体代码实现:
class UploadFileToServer(object):
def __init__(self):
"""
定义好需要访问的文件上传的请求
"""
self.url = 'http://{}:{}/uploadFileToServer'.format(vg.SERVICE_IP, vg.SERVICE_PORT)
def get_content_type(self, filename):
"""
获取到文件的content类型
:param filename:
:return:
"""
return mimetypes.guess_type(filename)[0] or 'application/octet-stream'
@log_wrapper('上传文件')
def upload_file_to_server(self, token, filename=None, headers=None, fields=None):
global file_path
if not filename:
filename = 'readme.txt'
file_path = get_upload_file_path(filename, 'files') # 这里是获取到文件的路径
get_content_type = self.get_content_type(file_path)
if not fields:
"""
定义data值,传入文件流
"""
fields = MultipartEncoder(
fields={
'file': ('readme.txt',
open(r"{}".format(file_path), "rb"),
get_content_type)}
)
if not headers:
"""
重新写入header
"""
headers = {
"Content-Type": fields.content_type,
"x-auth-token": token,
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36"
}
results = requests.post(url=self.url, headers=headers, data=fields)
return results.content
if __name__ == '__main__':
test = UploadFileToServer()
data = Auth().login()
token = data['data']['token'] # 获取登录的参数
res = test.upload_file_to_server(token)
js_d = json.loads(res) # 转换结果为json格式
fileName = js_d['data'][0]['fileName']
fileCode = js_d['data'][0]['fileCode']
print(fileName, fileCode) # 返回指定的参数
执行完之后:
DEBUG:urllib3.connectionpool:http://171.1.1.1:8080 "POST /uploadFileToServer HTTP/1.1" 200 None
readme.txt 2022060120563512885