2013-09-26 48 views
1

我有一個PHP的jQuery和jqGrd的Web應用程序;應用程序的功能之一是能夠上傳文件(在客戶端,這由jqGrid處理)並將內容插入到數據庫中。這一切都有效。我的問題是我還需要提供一個手動(或自動)文件上傳的命令行機制。所以我有以下Python代碼。該代碼成功登錄到我的API,我可以在PHP中看到我的POST數據,但是我在處理文件時出錯。Python POST文件到PHP

我需要發佈文件以同樣的方式將是通過Web界面...這會導致被填充PHP的$ _FILES。用我的代碼$ _FILES是空的。不知道我錯過了什麼。

import base64 
import cookielib 
import getopt 
import os 
import sys 
import urllib 
import urllib2 
import MultipartPostHandler 

...code to process command line args, log into api, get sessionId... 

# 
# import 
# 
opener = urllib2.build_opener(MultipartPostHandler.MultipartPostHandler) 
headers = {'Cookie': 'PHPSESSID=' + sessionId} 

params = { 
    'action': 'import', 
    'import': 'api', 
    'file': sourceFile, 
    'data': base64.b64encode(open(sourceFile, "rb").read()), 
    'id': id 
} 

urllib2.install_opener(urllib2.build_opener(MultipartPostHandler.MultipartPostHandler)) 
response = urllib2.urlopen(urllib2.Request(api, params, headers)) 

print response.read() 

知道sourceFile只是在命令行中提供的字符串很重要;它不是文件本身。我認爲這是問題。我在params ['data']中發送了params ['name']及其內容中的文件名字符串。我如何發送文件,就好像交互式地從網絡表單提交它並將其包含在參數['file']中?這是我需要做的嗎?

===編輯===
我不能使用任何模塊,但我已經導入。感謝您提供其他建議,例如請求。

+0

我認爲你不需要指定數據。嘗試 PARAMS = { '身份證': '身份證', '文件':開放(的資源文件, 'RB')} – Pixou

+0

那麼就沒有數據。再次,sourceFile是一個字符串 - 不是文件本身(不是文件對象)。 – user1801810

+0

本人來說我會用https://github.com/kennethreitz/requests代替我曾試圖設置PARAM [「文件」],打開(的資源文件,「RB」)和沒有工作的urllib2 –

回答

2

你可能不需要在PARAMS指定數據,但只給一個文件對象。嘗試

params = { 
    'id':'id', 
    'file':open(sourceFile, 'rb') 
} 
+0

這解決了我的問題。謝謝。 – user1801810