如何在 Python 中模拟 post 表单来上传文件

 我来答
从空去听8
2017-11-17 · TA获得超过7439个赞
知道大有可为答主
回答量:6907
采纳率:93%
帮助的人:5581万
展开全部

最近有个将文件上传到内部web服务器上的任务,于是参考了网上部分源码用python写了这个小程序,代码如下:

[python] view plain copy

  • #coding:utf-8  

  • ''''' 

  • Created on 2015.3.19 

  • @author: damofy 

  • '''  

  • import os  

  • import time  

  • import sys  

  • import urllib2  

  • ''''' 

  • filename   待上传的文件  

  • fieldname  表单域中的name属性 

  • '''  

  • def CreateBody(filename, fieldname, strBoundary):  

  • bRet = False  

  • sData = []  

  • sData.append('--%s' % strBoundary)  

  • #'Content-Disposition: form-data; name="uploadfile"; filename="XX-Net-1.3.6.zip"'  

  • sData.append('Content-Disposition: form-data; name="%s";' % fieldname + 'filename="%s"' % os.path.basename(filename))  

  • sData.append('Content-Type: %s\r\n' % 'application/octet-stream')  

  • try:  

  • pFile = open(filename, 'rb')  

  • sData.append(pFile.read())  

  • sData.append('--%s--\r\n' % strBoundary)  

  • bRet = True  

  • finally:  

  • pFile.close()  

  • return bRet, sData  

  • def uploadfile(http_url, filename, fieldname):          

  • if os.path.exists(filename):  

  • filesize = os.path.getsize(filename)  

  • print('file:' + filename + ' is %d bytes!' % filesize)  

  • else:  

  • print('file:' + filename + ' isn\'t exists!')  

  • return False  

  • strBoundary = '---------------------------%s' % hex(int(time.time() * 1000))  

  • bRet, sBodyData = CreateBody(filename, fieldname, strBoundary)  

  • if True == bRet:  

  • http_body = '\r\n'.join(sBodyData)  

  • stReq = urllib2.Request(http_url, http_body)  

  • stReq.add_header('User-Agent','Mozilla/5.0')  

  • stReq.add_header('Content-Length:', '%d' % filesize)  

  • stReq.add_header('Content-Type', 'multipart/form-data; boundary=%s' % strBoundary)          

  • resp = urllib2.urlopen(stReq, timeout=5)  

  • # get response  

  • msg = resp.read()  

  • print("Response content:\n" + msg)  

  • else:  

  • print("CreateBody failed!")  

  • return bRet  

  • if __name__ == '__main__':  

  • if len(sys.argv) > 2:  

  • http_url = sys.argv[1]  

  • filename = sys.argv[2]  

  • else:  

  • print('python upload.py http://10.20.131.23/upload ./test.dat')  

  • sys.exit()  

  • # 参数3 "uploadfile" 是post表单中的name属性,需要与服务端保持一致  

  • uploadfile(http_url, filename, 'uploadfile')  



已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式