0

我正在尝试根据上传到文件的文件上传提取站点的响应。网站有以下形式。

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
  </head>
  <body>
     <form method="POST" action="http://somewebsite.com/imgdigest" enctype="multipart/form-data">
        quality:<input type="text" name="quality" value="2"><br>
        category:<input type="text" name="category" value="1"><br>
        debug:<input type="text" name="debug" value="1"><br>
        image:<input type="file" name="image"><br>
        <input type="submit" value="Submit">
     </form>
  </body>
</html>

我想要做的是上传文件,提交表单并提取响应。

我首先看一个例子,我想我成功地完成了上传工作。因为当我运行它时,我没有收到任何错误。

import urllib2_file
import urllib2
import request
import lxml.html as lh

data = {'name': 'image',
        'file':  open('/user/mydir/21T03NAPE7L._AA75_.jpg')
       }
urllib2.urlopen('http://localhost/imgdigestertest.html', data)

不幸的是,我没有在这里提出请求来获得回复。我不知道我应该如何做出回应。一旦我得到响应,我应该能够使用一些我很舒服的模式匹配来提取数据。

根据提供的答案尝试了以下代码:

import requests

url = 'http://somesite.com:61235/imgdigest'
files = {'file': ('21e1LOPiuyL._SL160_AA115_.jpg', 
                  open('/usr/local/21e1LOPiuyL._SL160_AA115_.jpg', 'rb'))}
other_fields = {"quality": "2",
                "category": "1",
                "debug": "0"
               }
headers={'content-type': 'text/html; charset=ISO-8859-1'}

response = requests.post(url, data=other_fields, files=files, headers=headers)

print response.text

现在我收到以下错误:它告诉我一些图像文件没有正确附加。我们必须指定文件类型吗?

Image::Image(...): bufSize = 0.  Can not load image data. Image size = 0.   DigestServiceProvider.hpp::Handle(...) | 
4

1 回答 1

2

使用请求库(pip install requests如果您使用 pip)。

对于他们的示例,请参见此处: http ://docs.python-requests.org/en/latest/user/quickstart/#post-a-multipart-encoded-file

要自定义它看起来像你的:

import requests
url = 'http://localhost:8080/test_meth'
files = {'file': ('21T03NAPE7L._AA75_.jpg', 
                  open('./text.data', 'rb'))}
other_fields = {"quality": "2",
                "category": "1",
                "debug": "1"
               }
response = requests.post(url, data=other_fields, files=files)
print response.text

在我的本地系统上, text.data 包含以下内容:

Data in a test file.

我用cherrypy(pip install cherrypy)写了一个server.py来测试我上面给出的客户端。这是 server.py 的源代码:

import cherrypy
class Hello(object):
    def test_meth(self, category, debug, quality, file):
        print "Form values:", category, debug, quality
        print "File name:", file.filename
        print "File data:", file.file.read()
        return "More stuff."
    test_meth.exposed = True
cherrypy.quickstart(Hello())

当我运行上面的 client.py 时,它会打印:

More stuff.

正如您在 server.py 示例中看到的那样,返回的是什么。

同时,服务器说:

Form values: 1 1 2
File name: 21T03NAPE7L._AA75_.jpg
File data: Data in a test file.

127.0.0.1 - - [14/Jul/2012:00:00:35] "POST /test_meth HTTP/1.1" 200 11 "" "python-requests/0.13.3 CPython/2.7.3 Linux/3.2.0-26-generic"

因此,您可以看到客户端正在发布代码中描述的文件名和指定本地文件的文件内容。

需要指出的一点是,在这篇文章的开头,我说过要使用 requests 库。不要与您在原始问题中导入的 urllib 请求混淆。

于 2012-07-13T21:23:21.670 回答