Я пытаюсь загрузить файлы через Pycurl через POST, используя PHP-скрипт на принимающей стороне. По какой-то причине часть PHP вызывает ошибку. Я переработал это до двух коротких тестовых сценариев.move_uploaded_file() не может открыть поток
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
Это не похоже, проблема прав доступа, но тем не менее я ve проверил разрешения как каталога загрузки, так и/tmp. Я также проверил, что это не проблема с ограничением open_basedir.
В PHP инструкции по move_uploaded_file() он говорит следующее:
move_uploaded_file() обеспечивает безопасность этой операции, позволяя только те файлы, загруженные через PHP для перемещения.
Поскольку я загружаюсь через Python с помощью Curl, я понял, что это может быть проблемой. Но разве не должно быть другого сообщения об ошибке, если это так? Если это действительно проблема, что я могу сделать вместо этого? Я не использовал PHP много лет, так что вы могли бы сказать, что я немного ржавый.
Я не уверен, что это актуально, но на всякий случай, я тестирую это на Ubuntu 10.10 с помощью apache 2.2.16, PHP 5.3.3 и Python 2.6.6.
EDIT: Сюжет сгущается! Человек в Twitter взял мой PHP-скрипт и положил его на свой сервер, чтобы узнать, может ли он выяснить, в чем проблема. Он отлично работал для него при загрузке через обычную форму PHP/HTML. Поэтому я указал свой сценарий Python на свой PHP-скрипт, и внезапно все получилось просто отлично. Так что теперь мне интересно, что случилось с моей стороны ...? Как устранить эту проблему?
DID YU ACCESS ФАЙЛ НЕПОСРЕДСТВЕННО, ТИПИРОВАТЬ ПУТЬ? У НАСЛЕДОВАТЕЛЬНОЙ ПАПКИ ТАКЖЕ ИМЕЕТЕ РАЗРЕШЕНИЕ? – zod
Да и да. Файл (который я пытаюсь загрузить) полностью доступен. Целевая папка установлена на chmod 777. –
move_uploaded_file должен возвращать значение false, если файл, который вы пытаетесь переместить, не был загружен файлом. Поэтому я не думаю, что это имеет какое-либо отношение к тому, как вы загружаете файл, будь то из формы сообщения или из pycurl. Также попробуйте проверить $ _FILES ['uploaded'] ['error'] на всякий случай. – mellowsoon