2011-01-28 36 views

回答

1

找到一個cas與文件句柄一起工作的東西。然後只需傳遞一個StringIO對象而不是一個真實的文件描述符。

+0

不幸的是這兩種食譜需要一個文件名不是文件描述符。 – Naveen 2011-01-28 21:01:13

+0

上次我查找的東西有一個urllib2的補丁,它允許在POST數據列表中傳遞一個文件描述符 – ThiefMaster 2011-01-28 21:04:06

2

這(小)庫將採取文件描述符,並會做的HTTP POST操作:https://github.com/seisen/urllib2_file/

你可以傳遞一個StringIO對象(包含您在內存中的數據)作爲文件描述符。

+0

urllib2_file構建並傳遞它自己的測試。但是它無法通過cherrypy文件上傳示例http://docs.cherrypy.org/dev/progguide/files/uploading.html不能確定問題出在cherrypy示例或urllib2_file上。我試過python test-upload.py -u http://www.myurl.com -f mytest.py -n myFile – Naveen 2011-01-29 00:49:56

1

我今天遇到類似的問題,之後嘗試都和pycurl和多/表單數據,我決定讀蟒蛇httplib的/ urllib2的源代碼找出來,我沒有得到一個相當不錯的解決方案:在做後

    1. 設置Content-Length頭(文件)後做時傳遞一個打開的文件

    下面是代碼:

    import urllib2, os 
    image_path = "png\\01.png" 
    url = 'http://xx.oo.com/webserviceapi/postfile/' 
    length = os.path.getsize(image_path) 
    png_data = open(image_path, "rb") 
    request = urllib2.Request(url, data=png_data) 
    request.add_header('Cache-Control', 'no-cache') 
    request.add_header('Content-Length', '%d' % length) 
    request.add_header('Content-Type', 'image/png') 
    res = urllib2.urlopen(request).read().strip() 
    return res 
    

    見我的博客文章:http://www.2maomao.com/blog/python-http-post-a-binary-file-using-urllib2/

  • 1

    下面的Python代碼適用於2.6.x.可靠輸入數據是str類型。 請注意,接收數據的服務器必須循環讀取所有數據,因爲大數據量將被分塊。還附加了Java代碼片段來讀取分塊數據。

    def post(self, url, data): 
        self.curl = pycurl.Curl() 
        self.response_headers = StringIO.StringIO() 
        self.response_body = io.BytesIO() 
        self.curl.setopt(pycurl.WRITEFUNCTION, self.response_body.write) 
        self.curl.setopt(pycurl.HEADERFUNCTION, self.response_headers.write) 
        self.curl.setopt(pycurl.FOLLOWLOCATION, 1) 
        self.curl.setopt(pycurl.MAXREDIRS, 5) 
        self.curl.setopt(pycurl.TIMEOUT, 60) 
        self.curl.setopt(pycurl.ENCODING,"deflate, gzip") 
        self.curl.setopt(pycurl.URL, url) 
        self.curl.setopt(pycurl.VERBOSE, 1) 
        self.curl.setopt(pycurl.POST,1) 
        self.curl.setopt(pycurl.POSTFIELDS,data) 
        self.curl.setopt(pycurl.HTTPHEADER, [ "Content-Type: octate-stream" ]) 
        self.curl.setopt(pycurl.POSTFIELDSIZE, len(data)) 
        self.curl.perform() 
        return url, self.curl.getinfo(pycurl.RESPONSE_CODE),self.response_headers.getvalue(), self.response_body.getvalue() 
    

    的servlet引擎的Java代碼:

    int postSize = Integer.parseInt(req.getHeader("Content-Length")); 
    results = new byte[postSize]; 
    int read = 0; 
    while(read < postSize) { 
         int n = req.getInputStream().read(results); 
         if (n < 0) break; 
         read += n; 
        } 
    
    相關問題