文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Http服务传输图片的Python实现

2023-01-31 01:33

关注

介绍

主要介绍Python实现的Http服务传输图片的2种方式:URL和字节流

以URL的方式传输图片

服务器端

基于tornado框架搭建简单的web服务, 提供post方法, 通过接收image_url字段获取图片的url,通过requests模块获取图片并进行后续的操作。图片的操作重点关注process()方法。

#!/usr/bin/python
# -*-coding=utf-8 -*-

import sys
import traceback
from StringIO import StringIO

import requests
import tornado
import tornado.ioloop
import tornado.web
from tornado.escape import json_encode
from PIL import Image

reload(sys)
sys.setdefaultencoding('utf8')


class Handler(tornado.web.RequestHandler):

    def post(self):
        result = {}
        image_url = self.get_argument("image_url", default="")
        print image_url
        if not image_url:
            result["msg"] = "no image url"
        else:
            result["msg"] = self.process(image_url)
        self.write(json_encode(result))

    def process(self, image_url):
        """
        根据image_url获取图片进行处理

        :param image_url: 图片url
        """
        try:
            response = requests.get(image_url)
            if response.status_code == requests.codes.ok:
                obj = Image.open(StringIO(response.content))
                # TODO 根据obj进行相应的操作
                return "ok"
            else:
                return "get image failed."
        except Exception as e:
            print traceback.format_exc()
            return str(e)

class ImageServer(object):

    def __init__(self, port):
        self.port = port

    def process(self):
        app = tornado.web.Application([(r"/image?", Handler)], )
        app.listen(self.port)
        tornado.ioloop.IOLoop.current().start()

if __name__ == "__main__":
    server_port = "6060"
    server = ImageServer(server_port)
    print "begin server"
    server.process()

客户端

向服务器端的HTTP服务发送POST请求, 请求字段定义image_url。

#!/usr/bin/python
# -*-coding=utf-8 -*-

import json
import urllib
import urllib2


def post(server_url, params):
    data = urllib.urlencode(params)
    request = urllib2.Request(server_url, data)
    return json.loads(urllib2.urlopen(request, timeout=10).read())


if __name__ == "__main__":
    # 图片的URL
    image_url = "/file/imgs/upload/202301/31/i0vh3us4jub.jpg"
    # http服务的URL
    url = "http://10.10.20.20:6060/image?"
    print post(url, {"image_url": image_url})

以字节流方式传输图片

pickle模块和requests模块

服务器端

基于tornado的HTTP服务, 提供content参数,获取打包的图片内容,利用pickle.loads()方法获取图片内容,之后进行后续的操作。
HTTP搭建方式同URL方式, 简单修改post方法

# 其他部分参考上文URL服务的搭建方式
    def post(self):
        result = {}
        content = self.get_argument("content", default=None)
        if content is None:
            result["msg"] = "no image content"
        else:
            result["msg"] = self.content_process(content)
        self.write(json_encode(result))

    def content_process(self, image_content):
        """
        根据image_content进行相应操作

        :param image_content: 图片内容
        """
        try:
            content = pickle.loads(image_content)
            image = Image.open(StringIO(content))
            print image
            #TODO 根据image进行相应操作
            return "ok"
        except Exception as e:
            print traceback.format_exc()
            return str(e)

客户端

将本地图片文件利用pickle模块打包, 传送给服务器端进行处理; 利用requests模块获取远程图片并打包数据, 传送给服务器端进行处理。示例代码如下:

#!/usr/bin/python
# -*-coding=utf-8 -*-

import json
import urllib
import urllib2
import requests
import pickle


def post(server_url, params):
    data = urllib.urlencode(params)
    request = urllib2.Request(server_url, data)
    return json.loads(urllib2.urlopen(request, timeout=10).read())


def remote_image(server_url, image_url):
    """
    网络图片处理

    :param server_url: 服务器端HTTP服务URL
    :param image_url: 图片URL
    """
    content = requests.get(image_url)
    params = {"content": content}
    print post(server_url, params)


def local_image(server_url, image_path):
    """
    本地图片处理

    :param server_url: 服务器端HTTP服务URL
    :param image_path: 图片本地地址
    """
    r_file = open(image_path, "rb")
    content = pickle.dumps(r_file.read())
    params = {"content": content}
    print post(server_url, params)


if __name__ == "__main__":
    url = "http://localhost:6060/image?"

    # local image
    file_path = "D:\\log\\fastText.PNG"
    local_image(url, file_path)

    # remote image
    remote_url = "/file/imgs/upload/202301/31/i0vh3us4jub.jpg"
    remote_image(url, remote_url)

详情参考:
http://www.tornadoweb.org/en/stable/

http://www.python-requests.org/en/master/

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯