`
忧里修斯
  • 浏览: 435978 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Python HTTP文件上传

阅读更多
# -*- coding:UTF-8 -*-
'''
Created on 2010-4-26

@author: shiyong
'''
import urllib
import sys
import urllib2
import mimetools, mimetypes
import os, stat

from IdongNet import IdongNet
from UserManager import UserManager
import cookielib

class Callable:
    def __init__(self, anycallable):
        self.__call__ = anycallable

# Controls how sequences are uncoded. If true, elements may be given multiple values by
#  assigning a sequence.
doseq = 1

class MultipartPostHandler(urllib2.BaseHandler):
    handler_order = urllib2.HTTPHandler.handler_order - 10 # needs to run first

    def http_request(self, request):
        data = request.get_data()
        if data is not None and type(data) != str:
            v_files = []
            v_vars = []
            try:
                for(key, value) in data.items():
                    if type(value) == file:
                        v_files.append((key, value))
                    else:
                        v_vars.append((key, value))
            except TypeError:
                systype, value, traceback = sys.exc_info()
                raise TypeError, "not a valid non-string sequence or mapping object", traceback

            if len(v_files) == 0:
                data = urllib.urlencode(v_vars, doseq)
            else:
                boundary, data = self.multipart_encode(v_vars, v_files)
                contenttype = 'multipart/form-data; boundary=%s' % boundary
                if(request.has_header('Content-Type')
                   and request.get_header('Content-Type').find('multipart/form-data') != 0):
                    print "Replacing %s with %s" % (request.get_header('content-type'), 'multipart/form-data')
                request.add_unredirected_header('Content-Type', contenttype)

            request.add_data(data)
        return request

    def multipart_encode(vars, files, boundary = None, buffer = None): #@NoSelf
        if boundary is None:
            boundary = mimetools.choose_boundary()
        if buffer is None:
            buffer = ''
        for(key, value) in vars:
            buffer += '--%s\r\n' % boundary
            buffer += 'Content-Disposition: form-data; name="%s"' % key
            buffer += '\r\n\r\n' + value + '\r\n'
        for(key, fd) in files:
            file_size = os.fstat(fd.fileno())[stat.ST_SIZE]
            filename = os.path.basename(fd.name)
            contenttype = mimetypes.guess_type(filename)[0] or 'application/octet-stream'
            buffer += '--%s\r\n' % boundary
            buffer += 'Content-Disposition: form-data; name="%s"; filename="%s"\r\n' % (key, filename)
            buffer += 'Content-Type: %s\r\n' % contenttype
            # buffer += 'Content-Length: %s\r\n' % file_size
            fd.seek(0)
            buffer += '\r\n' + fd.read() + '\r\n'
        buffer += '--%s--\r\n\r\n' % boundary
        return boundary, buffer
    multipart_encode = Callable(multipart_encode)

    https_request = http_request
    
class FileUploadMgr(object):
    '''
            管理系统文件上传
    '''


    def __init__(self):
        '''
        Constructor
        '''
    
    def upload_file(self,post_params):
        '''
                    功能描述:上传文件
        
        '''
        cookies = cookielib.CookieJar()
        opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies),MultipartPostHandler)
        response = opener.open("http://us.i-dong.com/outer/server.action", post_params)
        return response.read()
        
        
    def upload_user_portrait(self,optType,width,height,portraitFile):
        '''
                    功能描述:用户注册时或者更改个人信息的时候,上传自定义头像
                    参数说明:
           optType  string 标识图片作用参数 0:个人头像
           width    string 图片压缩宽带,如:'800'
           height   string 图片压缩高度,如:'600'
           portraitFile    File(Python的文件对象)    上传的文件,上传的文件类型为:jpeg、gif、bmp、png、pjpeg、x-png
           
                    返回值:xml文档字符串
        '''
        post_params = {}
        post_params['userID'] = IdongNet.IdongID
        post_params['version'] = IdongNet.version
        post_params['webKey'] = IdongNet.webKey
        post_params['optType'] = optType
        post_params['width'] = width
        post_params['height'] = height
        post_params['portraitFile'] = portraitFile
        post_params['key'] = 'uploadUserPortrait'
        return self.upload_file(post_params)
    
if __name__ == '__main__':
    
    print UserManager.login(1, '205599','123456')
    fileuploadMgr = FileUploadMgr()
    logofile = open('C:\\1.jpg','rb')
    print fileuploadMgr.upload_user_portrait('0', '800' , '600', logofile)
    
        
分享到:
评论
2 楼 bluky999 2011-12-14  
文件上传的时候,必须按照标准HTTP协议来自己编码的?   没有现成的模块直接用么?
1 楼 xzs315 2011-08-30  
IdongNet   是个什么东西啊?

相关推荐

    python1008文件上传

    在Python编程语言中,文件上传是一项常见的任务,特别是在web开发、数据处理和文件管理场景中。本主题将深入探讨Python中的文件上传操作,包括基本概念、常用库以及具体实现步骤。 1. **基本概念**: 文件上传通常...

    基于python实现上传文件到OSS代码实例

    对于小文件上传,你可以使用`put_object`函数。以下是一个示例代码: ```python import oss2 import os # 替换和 auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>') # 替换 bucket = oss2.Bucket...

    pythonweb上传下载文件

    总结来说,使用Python和Flask实现文件上传和下载功能并不复杂,但需要考虑到安全性,确保应用的稳定性和用户的数据安全。通过理解这些基本概念,你可以构建出更高级的文件管理系统,满足各种Web应用的需求。

    python flask文件服务器

    通过以上知识点的整合和实现,我们可以创建一个功能完善的Python Flask文件服务器,满足文件上传、下载及安全认证的需求。在实际项目中,根据具体需求,可能还需要考虑性能优化、日志记录、数据库集成等其他方面。

    Python实现基于HTTP文件传输实例

    本文实例讲述了Python实现基于HTTP文件传输的方法。分享给大家供大家参考。具体实现方法如下: 一、问题: 因为需要最近看了一下通过POST请求传输文件的内容 并且自己写了Server和Client实现了一个简单的机遇HTTP的...

    http.rar_HTTP_python_python 文件_python http_python 下载文件

    在Python编程语言中,HTTP(超文本传输协议)是一个...总之,通过Python的requests库和多线程技术,我们可以高效、稳定地完成HTTP文件下载任务。无论是在开发小型脚本还是构建大型应用程序,这些基础知识都会非常有用。

    Python小型磁盘文件管理系统源码.zip

    同时,为了实现文件的上传和下载,可能还涉及到了网络编程,如使用`requests`库进行HTTP请求。 代码组织上,Python通常遵循模块化原则,每个功能可能对应一个单独的Python文件,如`file_operations.py`负责文件操作...

    python后端接收前端回传的文件方法

    打开浏览器访问`http://127.0.0.1:8000/upload/`,选择一个文件上传,查看结果。 #### 总结 通过以上步骤,我们成功实现了使用Python后端接收前端回传的文件功能。这种方法不仅适用于简单的文件上传场景,还可以...

    Python上传文件MultipartPostHandler.py

    总结起来,`MultipartPostHandler.py`是Python中处理文件上传的重要工具,它通过构建符合HTTP规范的MIME多部分请求,使得文件上传变得简单易行。掌握其工作原理和使用方法,对于进行Python Web开发的开发者来说,...

    基于python的文件的搜集与发送(内含源码和实验报告).zip

    3. 网络通信:学习使用requests库发送HTTP请求,或者使用smtplib和email库发送邮件,可能还有FTP客户端库如ftplib进行文件上传。 4. 文件路径处理:学习os.path模块,处理文件路径的拼接、解析和检查。 5. 错误处理...

    Python selenium文件上传方法汇总

    文件上传是所有UI自动化测试都要面对的一个头疼问题,今天博主在这里给大家分享下自己处理文件上传的经验,希望能够帮助到广大被文件上传坑住的seleniumer。 首先,我们要区分出上传按钮的种类,大体上可以分为两种...

    Python selenium文件上传方法汇总.pdf

    总结来说,Python Selenium提供了处理文件上传的强大功能,无论上传控件是标准的`<input type="file">`还是非标准的HTML元素。通过结合不同的技术,如AutoIt、PyWin32或SendKeys,我们可以有效地应对各种复杂的文件...

    MultipartPostHandler python 表单文件post

    总结来说,MultipartPostHandler是Python中处理文件上传的一种实用工具,它利用`urllib3`库的功能来构造和发送多部分/表单数据的POST请求。理解和熟练使用这个工具,可以帮助开发者更高效地与服务器进行文件交互,...

    基于Python的网络传输文件功能的设计与实现.zip

    `requests`库是常用的第三方库,它简化了HTTP请求的处理,支持文件上传和下载。 6. **数据压缩与解压缩**:Python的`gzip`和`bz2`库支持GZIP和BZIP2压缩格式,`zipfile`和`tarfile`库则处理ZIP和TAR档案。这些库...

    Python 使用 simple-http-server 在局域网上传下载数据

    一个可用于局域网上传下载的 Python 模块,使用介绍查看该文章:使用Python开启局域网传送数据(3):使用 simple_http_server 实现上传下载功能(https://blog.csdn.net/qq_45476428/article/details/129721441)。...

    http-file-server:使用python,上传和下载文件

    http-file-server 是用 python 实现的 HTTP 文件服务器,支持上传和下载文件。 运行 $ python file-server.py files 8001 其中第一个参数 files 是存放文件的路径,第二个参数 8001 是 HTTP 服务器端口。 接口 1. ...

    python文件传输demo

    对于更复杂的文件传输,如网页上的文件上传或下载,可以使用`http.client`或第三方库如`requests`。HTTP/HTTPS协议支持通过Web服务器进行文件传输,提供了身份验证、加密和错误处理等功能。 6. **SFTP(Secure ...

    Python文件上传两种方法对比

    在Python编程中,文件上传是常见的操作,尤其在构建Web应用程序时。本篇文章将对比两种主要的文件上传方法,帮助开发者更好地理解它们的差异和适用场景。 第一种方法:基于HTML表单的传统文件上传 在传统的文件...

    python读写远程主机文件源代码

    Python的`ftplib`库允许我们创建FTP客户端,实现登录远程服务器、上传、下载、列出目录内容等操作。例如,可以创建一个FTP连接,然后使用`RETR`命令读取文件,`STOR`命令写入文件。 3. **SFTP(Secure File ...

    基于electron+vite+vue3和python flask的文件交互GUI.zip

    基于electron+vite+vue3和python flask的文件交互GUI.zip本项目是一个Electron项目,有一个文件上传接口,可以上传图片到Flask框架的后端,处理完(本项目的处理是去色加水印"myWatermark")后直接返回前端显示。...

Global site tag (gtag.js) - Google Analytics