Python django中的请求无法发送文件

Python django中的请求无法发送文件,python,django,Python,Django,我正在编写一个Django应用程序,它将使用文件上传功能,然后通过上传的文件发送到另一个web服务,这本质上是一个PHP页面,用于侦听发送给它的文件。我正在使用将上载的文件发送到web服务。但是,当我在web服务中看到日志时,我看到PHP页面接收到以下文件数组,无论我发送什么文件: Array ( [file] => Array ( [name] => file [type] => [tmp_name] => C:\wamp\tmp\phpAB43.tmp [

我正在编写一个Django应用程序,它将使用文件上传功能,然后通过上传的文件发送到另一个web服务,这本质上是一个PHP页面,用于侦听发送给它的文件。我正在使用将上载的文件发送到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)

我已检查文件是否确实上载到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”,我认为你错了。
$\u 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不同,在PHP中,脚本中的任何更改都会自动反映在下一个请求中—如果您使用的是web服务器,则在重新启动该进程之前,更改代码可能不会影响WSGI应用程序的运行实例

[编辑]

您可能需要明确设置文件名、内容类型和标题:

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

请不要信任
$\u文件['file']['name']
,也不要将文件上载到您在web上提供服务的路径,否则您将要求被删除。

您能详细说明问题的具体原因吗?您希望看到什么?出现了什么问题?我希望发送的文件也能在PHP文件中接收。但是,无论我上传什么文件,我都会在上传的文件数组中获得“file”作为文件名。这是因为您选择了“file”作为用于
文件的dict上的键。更新你的问题总是比使用评论系统更好。我已经更新了我的问题。这是关键的权利,从上传的文件列表中检索正确的文件?无论上传什么文件,临时文件名和大小始终相同?我觉得很难相信。你试过从REPL发送吗?你确定每次更改代码时都在重新加载Django应用程序吗?我在shell中尝试了以下方法。它正在发送正确的文件。当我从django应用程序尝试它时,情况就不一样了。我也试过重新启动服务器。Gaurav,我正试着帮你。您是否阅读了有关更改代码后重新启动web服务器的内容?另外,您是否注意到我所说的,您希望
$\u FILES
数组的键是表单字段的名称而不是原始文件名?我尝试过,但没有效果。我还对该问题进行了另一次编辑。在我看来,请求中似乎没有设置正确的文件名,但发送了正确的文件。明确指定文件名似乎可以解决问题。谢谢。:)
files = {'file': (
    'yourfile.txt', 
    open('/path/to/yourfile.txt', 'rb'), 
    'text/plain', 
    {'Expires': '0'}
)}