python3关于表单上传文件到服务器

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值