【问题标题】:Python urllib2 file upload problemsPython urllib2 文件上传问题
【发布时间】:2010-09-29 06:41:35
【问题描述】:

我目前正在尝试使用 urllib2 和 urllib2_file 库启动文件上传。这是我的代码:

import sys
import urllib2_file
import urllib2

URL='http://aquate.us/upload.php'
d = [('uploaded', open(sys.argv[1:]))]
req = urllib2.Request(URL, d)
u = urllib2.urlopen(req)
print u.read()

我已将此 .py 文件放在我的“我的文档”目录中,并在我的“发送到”文件夹中放置了指向它的快捷方式(快捷方式 URL 为 )。

当我右键单击一个文件,选择“发送到”,然后选择“Aquate”(我的 Python)时,它会在瞬间打开一个命令提示符,然后将其关闭。什么都没有上传。

我知道可能发生了错误,所以我将代码逐行输入到 CL python 中。 当我运行u=urllib2.urlopen(req) 行时,我没有收到错误; alt text http://www.aquate.us/u/55245858877937182052.jpg

相反,光标只是在该行下方的新行上开始闪烁。我等了几分钟,看看是否会发生什么事情,但它就是这样。为了让它停止,我必须按 ctrl+break。

这个脚本是怎么回事?

提前致谢!

[编辑] 忘了提——当我在没有请求数据(文件)的情况下运行脚本时,它运行起来就像一个魅力。是 urllib2_file 的问题吗?

[编辑 2]:

import MultipartPostHandler, urllib2, cookielib,sys
import win32clipboard as w
cookies = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies),MultipartPostHandler.MultipartPostHandler)
params = {"uploaded" : open("c:/cfoot.js") }
a=opener.open("http://www.aquate.us/upload.php", params)
text = a.read()
w.OpenClipboard()
w.EmptyClipboard()
w.SetClipboardText(text)
w.CloseClipboard()

如果您通过命令行运行该代码,它的作用就像一个魅力。

【问题讨论】:

    标签: python post upload urllib2


    【解决方案1】:

    如果你还在使用 Python2.5,对我有用的是在这里下载代码:

    http://peerit.blogspot.com/2007/07/multipartposthandler-doesnt-work-for.html

    并将其保存为 MultipartPostHandler.py

    然后使用:

    import urllib2, MultipartPostHandler
    
    opener = urllib2.build_opener(MultipartPostHandler.MultipartPostHandler())
    opener.open(url, {"file":open(...)})
    

    或者如果您需要 cookie:

    import urllib2, MultipartPostHandler, cookielib
    
    cj = cookielib.CookieJar()
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj), MultipartPostHandler.MultipartPostHandler())
    opener.open(url, {"file":open(...)})
    

    【讨论】:

      【解决方案2】:

      如果您使用的是 Python 2.5 或更新版本,urllib2_file 是不必要且不受支持的,因此请检查您使用的是哪个版本(可能还需要升级)。

      如果您使用的是 Python 2.3 或 2.4(urllib2_file 支持的唯一版本),请尝试运行 the sample code 并查看是否有同样的问题。如果是这样,您的 Python 或 urllib2_file 安装可能有问题。

      编辑:

      另外,您似乎没有使用urllib2_file 的两种支持的POST 数据格式。尝试使用以下两行中的 一个

      d = ['uploaded', open(sys.argv[1:])]
      ## --OR-- ##
      d = {'uploaded': open(sys.argv[1:])}
      

      【讨论】:

      • 你说 urllib2_file 在 python 2.5 和更高版本上是不必要的,但是这个功能在 python 中还不存在。基于bugs.python.org/issue3244,multipart/form-data 上传可能在 2.7 中,但尚未发布。
      • 自从我一年多前发布这个问题以来,我还没有研究过这个问题,但当时,我能够在 Python 2.6 中复制 urllib2_file 的功能,甚至图书馆的页面都说它只是Python 2.3 和 2.4 需要。我只能假设错误是指一些单独的(但可能密切相关的)问题。 :-)
      【解决方案3】:

      首先,还有第三种运行 Python 程序的方法。

      在 cmd.exe 中,键入 python myprogram.py。你会得到一个很好的日志。您不必一次输入一行内容。

      其次,查看urrlib2 文档。您还需要查看urllib

      一个请求需要一个 URL 和一个 urlencoded 编码的数据缓冲区。

      数据应该是一个缓冲区 标准 应用程序/x-www-form-urlencoded 格式。 urllib.urlencode() 函数采用映射或序列 2元组并返回一个字符串 这种格式。

      您需要对数据进行编码。

      【讨论】:

        猜你喜欢
        • 2011-06-21
        • 1970-01-01
        • 1970-01-01
        • 2011-10-17
        • 1970-01-01
        • 2011-01-25
        • 1970-01-01
        • 2010-10-17
        相关资源
        最近更新 更多