我正在编写一个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'。那很奇怪吧?
答案 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']
并且永远不要将文件上传到您也在网络上投放的路径,否则您将要求进行宣传。