我正在尝试通过POST使用Pycurl上传文件,在接收端使用PHP脚本。由于某种原因,PHP部分似乎导致错误。我把它简化为两个简短的测试脚本。
import pycurl
UPLOADURL = "http://127.0.0.1/~nevon/receive.php" #URL to the PHP script
PATH = "/home/nevon/Desktop/testfile" #path to the file I'm trying to upload
c = pycurl.Curl()
c.setopt(c.POST, 1)
c.setopt(c.URL, UPLOADURL)
c.setopt( c.HTTPPOST, [("uploaded", (c.FORM_FILE, PATH))] )
c.perform()
c.close()
receive.php:
<?php
ini_set('display_errors','On');
$target = getcwd()."/upload/";
$target = $target . basename( $_FILES['uploaded']['name']) ; $ok=1;
if (move_uploaded_file($_FILES['uploaded']['tmp_name'], $target)) {
echo "The file ". basename( $_FILES['uploadedfile']['name']). " has been uploaded";
} else {
echo "Something went wrong.";
}
?>
我在测试时收到的错误是:
Warning: move_uploaded_file(/home/nevon/public_html/upload/testfile): failed to open stream: No such file or directory in /home/nevon/public_html/receive.php on line 7
Warning: move_uploaded_file(): Unable to move '/tmp/phpevKFCC' to '/home/nevon/public_html/upload/testfile' in /home/nevon/public_html/receive.php on line 7
它似乎不是权限问题,但我已经检查了上传目录和/ tmp的权限。我也检查过open_basedir限制不是问题。
在move_uploaded_file()的PHP手册中,它说明如下:
move_uploaded_file()通过仅允许移动通过PHP上传的文件来确保此操作的安全性。
由于我使用Curl通过Python上传,我认为这可能是问题所在。但是,如果是这种情况,是不是应该有不同的错误信息? 如果这确实是问题所在,我该怎么办呢?我多年来都没有真正使用PHP,所以你可以说我有点生疏。
我不确定它是否相关,但为了以防万一,我正在使用apache 2.2.16,PHP 5.3.3和Python 2.6.6在Ubuntu 10.10上进行测试。
编辑:情节变浓! Twitter上的一个人拿走了我的PHP脚本并将其放在他的服务器上,看看他是否能找出问题所在。通过常规的PHP / HTML表单上传时,它对他来说很好。所以我将我的Python脚本指向他的PHP脚本,突然间它工作得很好。所以现在我想知道,我的结局有什么不对......?我该如何解决这个问题?
答案 0 :(得分:4)
您的脚本按顺序查看。这显然是$target
目录的问题。 10000%确保目录/上传已存在。 move_uploaded_file()
无法为您创建。