2013-09-26 23 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