django中的请求无法发送文件

时间:2015-01-29 13:56:34

标签: python django

我正在编写一个Django应用程序,该应用程序将使用文件上传功能,然后将上传的文件发送到另一个Web服务,该服务本质上是一个PHP页面,用于监听发送给它的文件。我正在使用Requests将上传的文件发送到Web服务。但是,当我在我的Web服务中看到日志时,无论我发送的文件是什么,我都会在PHP页面看到以下文件数组:

Array
(
[file] => Array
 (
 [name] => file
 [type] =>  [tmp_name] => C:\wamp\tmp\phpAB43.tmp
  [error] => 0
  [size] => 1142
 )
)

我发送的文件位于settings.py中MEDIA_ROOT指定的目录中。我尝试了两种代码组合中的任何一种,导致相同的输出:

uploadedFile = request.FILES['uploadedFile'] 
files = {'file': open(settings.MEDIA_ROOT+uploadedFile.name, 'rb')}
response = requests.post(url, files=files)

uploadedFile = request.FILES['uploadedFile']
files = {'file': uploadedFile}
response = requests.post(url, files=files)

我已检查过该文件确实已上传到MEDIA_ROOT指定的目录中。这种情况发生的可能原因是什么?

EDIT1:我应该收到我在列表中发送的文件,比如

Array
(
[file] => Array
 (
 [name] => test.txt
 [type] => [tmp_name] => C:\wamp\tmp\phpAFDC.tmp
 [error] => 0
 [size] =>1142)

)

EDIT2:接收该文件的PHP代码,它只打印出请求中收到的文件数组:

    $a = print_r($_FILES, true);
    fwrite(fopen("c:\\Users\\MyUser\\Desktop\\log1.txt", 'w'), $a);

EDIT3:我查看了发送过的文件,并在Web服务端复制了该文件。我将扩展名更改为.txt,这是正在发送的文件的扩展名,结果证明它是同一个文件,没有扩展名,文件名是' file'。那很奇怪吧?

1 个答案:

答案 0 :(得分:0)

关于" EDIT1"我认为你错了。 $_FILES数组中的键是您用于发送文件的表单中的字段名称,而不是文件系统上的原始文件名。

为了测试问题,请使用Django REPL:

$ python manage.py shell
>>> import requests
>>> files = {'foobar': open('/etc/passwd')}
>>> url = 'http://example.com/test.php'  # Replace by your URL here
>>> r = response = requests.post(url, files=files)

然后告诉我们尺寸是否改变了。如果它改变了,我的猜测是你正在改变代码但是没有重新加载应用程序。请注意,Django与PHP不同,脚本中的任何更改都会自动反映在下一个请求中 - 如果您使用的是Web服务器,在重新启动进程之前,更改代码可能不会影响WSGI应用程序的运行实例。

[编辑]

您可能需要明确设置文件名,content_type和标题:

files = {'file': (
    'yourfile.txt', 
    open('/path/to/yourfile.txt', 'rb'), 
    'text/plain', 
    {'Expires': '0'}
)}

请不要相信$_FILES['file']['name']并且永远不要将文件上传到您也在网络上投放的路径,否则您将要求进行宣传。