Python urllib2文件上传问题

时间:2009-01-02 17:23:56

标签: python post upload urllib2

我目前正在尝试使用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)。

当我右键单击一个文件时,选择Send To,然后选择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()

如果您通过命令行运行该代码就像魅力一样。

3 个答案:

答案 0 :(得分: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:])}

答案 1 :(得分:0)

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

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

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

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

  

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

您需要对数据进行编码。

答案 2 :(得分:0)

如果你还在使用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(...)})

或者如果你需要cookies:

import urllib2, MultipartPostHandler, cookielib

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