2009-01-02 15 views
6

Ich versuche derzeit, einen Dateiupload mit Urllib2 und der urllib2_file-Bibliothek zu initiieren. Hier ist mein Code:Python urllib2 Datei-Upload-Probleme

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() 

ich diese Py-Datei abgelegt habe in meinem Verzeichnis Eigene Dateien und platziert eine Verknüpfung, um es in meinem Senden an Ordner (die Abkürzung URL ist).

Wenn ich mit der rechten Maustaste auf eine Datei klicke, auf Senden an klicke und Aquate (mein Python) auswähle, öffnet sie eine Eingabeaufforderung für einen Sekundenbruchteil und schließt sie dann. Es wird nichts hochgeladen.

Ich wusste, dass wahrscheinlich ein Fehler auftrat, also tippte ich den Code Zeile für Zeile in CL python ein. Wenn ich die u=urllib2.urlopen(req) Zeile ausgeführt habe, habe ich keinen Fehler erhalten; alt text http://www.aquate.us/u/55245858877937182052.jpg

Stattdessen begann der Cursor einfach auf einer neuen Zeile unter dieser Zeile zu blinken. Ich wartete ein paar Minuten, um zu sehen, ob etwas passieren würde, aber es blieb einfach so. Um es zu stoppen, musste ich Strg + Pause drücken.

Was ist los mit diesem Skript?

Vielen Dank im Voraus!

[Bearbeiten] Vergessen zu erwähnen - wenn ich das Skript ohne die Anfrage Daten (die Datei) lief es lief wie ein Charme. Ist es ein Problem mit urllib2_file?

[bearbeiten 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() 

Dieser Code funktioniert wie ein Charme, wenn Sie es über die Befehlszeile ausgeführt werden.

Antwort

2

Wenn Sie Python 2.5 oder neuer verwenden, ist urllib2_file nicht erforderlich und wird nicht unterstützt. Überprüfen Sie daher, welche Version Sie verwenden (und möglicherweise aktualisieren).

Wenn Sie Python 2.3 oder 2.4 verwenden (die einzigen Versionen, die von urllib2_file unterstützt werden), versuchen Sie the sample code auszuführen und sehen Sie, ob Sie das gleiche Problem haben. Wenn dies der Fall ist, ist wahrscheinlich etwas mit der Installation von Python oder urllib2_file nicht in Ordnung.

EDIT:

Auch scheinen Sie auch nicht von urllib2_file ‚s zwei unterstützten Formate für POST-Daten zu verwenden. Versuchen Sie ein der folgenden zwei Zeilen anstelle:

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

Sie sagen, dass urllib2_file auf Python 2.5 und höher nicht notwendig ist, aber diese Funktionalität existiert in Python noch nicht. Basierend auf http://bugs.python.org/issue3244, können Multipart/Formulardaten-Uploads hier in 2.7 sein, aber das ist noch nicht veröffentlicht. – archbishop

+0

Ich habe das Problem nicht untersucht, seit ich dies vor mehr als einem Jahr gepostet habe, aber zu der Zeit war ich in der Lage, die Funktionalität von urllib2_file in Python 2.6 zu duplizieren und sogar die Seite der Bibliothek sagt, dass sie nur für Python 2.3 und 2.4 benötigt wird. Ich kann nur davon ausgehen, dass sich Bug auf ein separates (aber wahrscheinlich eng verwandtes) Problem bezieht. :-) –

+0

Der Link zum Beispielcode ist ein toter Link. – neowulf33

0

Erstens gibt einen dritten Weg, Python-Programme auszuführen.

Geben Sie in cmd.exe python myprogram.py ein. Du bekommst ein schönes Protokoll. Sie müssen nicht immer Zeile für Zeile eingeben.

Zweitens, überprüfen Sie die urrlib2 Dokumentation. Sie müssen auch auf urllib schauen.

Eine Anfrage erfordert eine URL und einen urlencodierten codierten Datenpuffer.

Daten sollen ein Puffer in dem Standard Anwendung/x-www-form-urlencoded Format sein. Die Funktion urllib.urlencode() nimmt eine Zuordnung oder Sequenz von 2-Tupeln und gibt eine Zeichenfolge in dieses Format zurück.

Sie müssen Ihre Daten verschlüsseln.

0

Wenn Sie noch auf python2.5 sind, was für mich gearbeitet wurde, den Code hier zum Download:

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

und speichern Sie es als MultipartPostHandler.py

dann verwenden:

import urllib2, MultipartPostHandler 

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

oder wenn Sie Cookies:

import urllib2, MultipartPostHandler, cookielib 

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