Python上传磁盘和网络图片,内存图片,使用requests

举报
风吹稻花香 发表于 2021/06/05 00:15:24 2021/06/05
【摘要】 参考:http://www.jianshu.com/p/c80865b2057e 从磁盘上传: open(path, 'rb') #打开文件os.path.basename(path) #获取文件名requests.post(url, data, json, **kwargs) #requests请求 上传代码: import requests data_...

参考:http://www.jianshu.com/p/c80865b2057e

从磁盘上传:


   
  1. open(path, 'rb') #打开文件
  2. os.path.basename(path) #获取文件名
  3. requests.post(url, data, json, **kwargs) #requests请求

上传代码:


   
  1. import requests
  2. data_param= {"some_key": "yibeibanzhan", "timestamp": 1494920537,
  3. 'img_name': image_name}
  4. file_obj = open(path, 'rb')
  5. img_file= {image_name: file_obj}#fixed at 2017-05-19 10:49:57
  6. data_result = requests.post(url, data_param, files=img_file)
  7. if isinstance(file_obj, file):
  8. file_obj.close()

上传图片的同时可以附带一些参数在data_param中,API调用的时候一般要传一些例如api_key的东西。如果需要获取文件名,上面列出了获得本地文件的文件名的技巧。
从本地上传图片的话,open得到file对象,那么 files=img_file 中的key无所谓叫什么名字,都上传能够成功,原理在后面解释

从URL获取图片并直接上传


   
  1. import urllib2
  2. import cStringIO
  3. from PIL import Image
  4. import io
  5. def load_image(url):
  6. image_file = cStringIO.StringIO(urllib2.urlopen(url).read())
  7. image_data = Image.open(image_file)
  8. output = io.BytesIO()
  9. image_data.save(output, format='JPEG') # format=image_data.format
  10. print image_data.format #输出的不一定是JPEG也可能是PNG
  11. image_data.close()
  12. data_bin = output.getvalue()
  13. output.close()
  14. return data_bin

那么同样,可以重用之前的代码:


   
  1. image_name = 'xxx'
  2. data_param= {"some_key":"yibeibanzhan", "timestamp":1494920537,
  3. 'img_name': image_name} #有些API要求指定文件名参数
  4. file_obj = load_image(url)
  5. #fixed at 2017-05-19 10:49:57
  6. img_file= {image_name: file_obj} #Very Important.
  7. #the key must be the filename,
  8. #because the requests cannot guess the correct filename from the bytes array.
  9. data_result = requests.post(url, data_param, files=img_file)
  10. if isinstance(file_obj, file): #这里load_image获得的是二进制流了,不是file对象。
  11. file_obj.close()

关于上传的files参数的改正:

requests的\requests\models.py中 145行左右:


   
  1. def _encode_files(files, data):
  2. ...
  3. else:
  4. fn = guess_filename(v) or k
  5. fp = v
  6. ...
  7. rf = RequestField(name=k, data=fdata, filename=fn, headers=fh)

这里会根据传入的

img_file= {image_name: file_obj}

  

猜测他的文件名:当他是file对象的时候,可以通过file.name获得最终正确的文件名,当他是字节流,byte array的时候,只能通过image_name这个字符串获得。

因此,为了避免出现上传文件的文件名不一致,导致API提供方校验不通过的问题,这里必须提供文件名。

以上。

文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/78775843

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。