2010-10-21 4 views
2

Я пытаюсь загрузить файлы через 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-скрипт, и внезапно все получилось просто отлично. Так что теперь мне интересно, что случилось с моей стороны ...? Как устранить эту проблему?

+0

DID YU ACCESS ФАЙЛ НЕПОСРЕДСТВЕННО, ТИПИРОВАТЬ ПУТЬ? У НАСЛЕДОВАТЕЛЬНОЙ ПАПКИ ТАКЖЕ ИМЕЕТЕ РАЗРЕШЕНИЕ? – zod

+0

Да и да. Файл (который я пытаюсь загрузить) полностью доступен. Целевая папка установлена ​​на chmod 777. –

+0

move_uploaded_file должен возвращать значение false, если файл, который вы пытаетесь переместить, не был загружен файлом. Поэтому я не думаю, что это имеет какое-либо отношение к тому, как вы загружаете файл, будь то из формы сообщения или из pycurl. Также попробуйте проверить $ _FILES ['uploaded'] ['error'] на всякий случай. – mellowsoon

ответ

4

Ваш сценарий выглядит в порядке. Это явно проблема с каталогом $target. Сделайте 10000% уверенным, что каталог/загрузка уже существует. move_uploaded_file() не может создать его для вас.

Смежные вопросы