move_uploaded_file не удалось открыть поток, и ошибка отказа в разрешении - сервер wamp с окнами

я использую wamp на Windows 7

я пытаюсь загрузить некоторые изображения через форму в мое приложение MVC. я работаю со своего ноутбука, поэтому Wamp установлен на моем ноутбуке

моя проблема в том, что я продолжаю получать это сообщение:

 Warning: move_uploaded_file(C:\Users\test\zend\\module\guest\src\guest/pics/holdover/pic.jpg): failed to open stream: Permission denied in 

моя проблема в том, что я не ограничил никаких предварительных настроек, поэтому я не знаю, почему это будет ограничено.

не говоря уже об этом, куда мне обратиться на моем WAMP, чтобы включить доступ к папке?

заранее спасибо за совет

мой код:

цель file_upload — передать файл (в настоящее время хранящийся во временной папке) в другую папку. ему также дали новое имя.

все остальное работает. проблема с разрешением папки-получателя; в разрешении отказано

if ($form->isValid()) 
{       
    $size = new Size(array('min'=>2000)); //minimum bytes filesize

    $adapter = new \Zend\File\Transfer\Adapter\Http();
    $adapter->setValidators(array($size), $data['fileupload']['name']);
    if (!$adapter->isValid())
    {
        $dataError = $adapter->getMessages();
        $error = array();
        foreach($dataError as $key=>$row)
        {
            $error[] = $row;
        }
        $form->setMessages(array('fileupload'=>$error ));
    } 
    else
    {
        $fileName = $data['fileupload']['name']; 
        $fileTmpLoc = $data['fileupload']['tmp_name']; 
        $fileType = $data['fileupload']['type'];
        $fileSize = $data['fileupload']['size']; 
        $fileErrorMsg = $data['fileupload']['error'];
        $kaboom = explode(".", $fileName); 
        $this->fileExt = end($kaboom); 
        $this->fileName = "user_{$this->getAbbriviation($data)}{$this->getUserId()}.$this->fileExt";



        $moveResult = move_uploaded_file($fileTmpLoc, dirname(__DIR__)."/pics/member/holdover/$this->fileName");

        if ($moveResult != true)
        {
            echo "ERROR: File not uploaded. Try again.";
            unlink($this->fileTmpLoc); 
            exit();
        }
        $this->processAndUploadPhotos($data);

        //  var_dump($moveResult); die();      
        $adapter->setDestination(dirname(__DIR__).'/testImage');
        if ($adapter->receive($data['fileupload']['name'])) {
            $profile->exchangeArray($form->getData());

            echo 'Profile Name '.$profile->profilename.' upload ';
        }
    }  
}
}

И важный бит

<VirtualHost *:80>
    ServerName Zend
    DocumentRoot "C:\Users\zend\testingZend2\public"
    SetEnv APPLICATION_ENV "development"
    <Directory "C:\Users\zend\testingZend2\public">
        DirectoryIndex index.php
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

person user3389187    schedule 07.05.2014    source источник
comment
Покажите свой PHP-код, который выполняет загрузку. Отредактируйте свой вопрос, чтобы добавить код.   -  person RiggsFolly    schedule 07.05.2014


Ответы (2)


Вы можете установить права доступа к папке с помощью команды chmod, попробуйте эту команду в файле сценария php.

 if( chmod($path, 0777) ) {

      move_uploaded_file($path)

 }
 else
    echo "Couldn't do it.";
person venkatesh    schedule 07.05.2014
comment
WAMPServer работает в Windows. Вам не нужно делать это на окнах. - person RiggsFolly; 07.05.2014
comment
привет Риггс. спасибо за ответ. но я не ясно вашего ответа. куда мне нужно пойти, чтобы я мог изменить разрешения? - person user3389187; 07.05.2014
comment
Не могли бы вы опубликовать полный код. так что мы можем предложить. - person venkatesh; 07.05.2014
comment
@RiggsFolly Я.. это правда.. Это моя ошибка, я не прочитал вопрос должным образом - person venkatesh; 07.05.2014
comment
привет РиггсФолли. я добавил свой код. но, как я уже сказал, проблема в принимающей директории. Этот каталог должен быть доступен для записи и иметь разрешение на доступ - person user3389187; 07.05.2014
comment
Убедитесь, что пользователь Apache работает с полным доступом на запись к папке, в которую вы пытаетесь переместить файлы (щелкните правой кнопкой мыши и выберите общий доступ или разрешения в зависимости от версии Windows) - person venkatesh; 07.05.2014

Проблема в том, что ваше определение виртуального хоста дает доступ к "C:\Users\zend\testingZend2\public", но вы пытаетесь сохранить изображения в совершенно другой папке C:\Users\test\zend\\module\guest\src\guest/pics/holdover/pic.jpg.

Несмотря на двойное \\ между zend и module, вам также придется предоставить Apache доступ к этой другой структуре папок.

Поэтому вам нужно добавить еще одно определение <Directory.., чтобы Apache знал, что этот сайт имеет доступ к другой структуре папок, а также к папкам, из которых он работает.

<VirtualHost *:80>
    ServerName Zend
    DocumentRoot "C:\Users\zend\testingZend2\public"
    SetEnv APPLICATION_ENV "development"
    <Directory "C:\Users\zend\testingZend2\public">
       DirectoryIndex index.php
       AllowOverride All
       Order allow,deny
       Allow from all
    </Directory>
    <Directory "C:/Users/test/zend/module/guest/src/guest/pics/holdover">
       Order allow,deny
       Allow from all
    </Directory>
</VirtualHost>

Это нормально делать с таким псевдонимом

<VirtualHost *:80>
    ServerName Zend
    DocumentRoot "C:\Users\zend\testingZend2\public"
    SetEnv APPLICATION_ENV "development"
    <Directory "C:\Users\zend\testingZend2\public">
       DirectoryIndex index.php
       AllowOverride All
       Order allow,deny
       Allow from all
    </Directory>
    Alias /pictures "C:/Users/test/zend/module/guest/src/guest/pics/holdover"
    <Directory "C:/Users/test/zend/module/guest/src/guest/pics/holdover">
       Order allow,deny
       Allow from all
    </Directory>
</VirtualHost>

Это позволяет вам использовать псевдоним, т. е. изображения в вашем коде, а не полное имя каталога.

Также хорошей идеей будет придерживаться разделителя каталогов Unix в любой информации о файлах/каталогах, поскольку PHP будет автоматически выполнять все необходимые преобразования в разделитель DOS, если он работает в DOS.

person RiggsFolly    schedule 07.05.2014
comment
привет РиггсФолли; Спасибо за ответ. я попробую это сейчас. я также пытался придерживаться разделителя каталогов UNix, но когда я устал разделять это противоположным образом, PHP не мог интерпретировать последнюю переменную; $moveResult = move_uploaded_file($fileTmpLoc, dirname(DIR).\pics\member\holdover\$this-›fileName); - person user3389187; 07.05.2014
comment
Это потому, что у вас есть разделители DOS в строке с двойными кавычками. Обратная косая черта — это escape-символ при использовании в строке с двойными кавычками, поэтому, чтобы получить обратную косую черту, вам нужно будет сделать move_uploaded_file($fileTmpLoc, dirname(DIR)."\\pics\\member\\holdover\\$this->fileName");. проще просто сделать move_uploaded_file($fileTmpLoc, dirname(DIR)."/pics/member/holdover/$this->fileName"); - person RiggsFolly; 07.05.2014
comment
Привет Риггс Фоллой; благодарен за вашу помощь. я попробовал ваши предложения, но я все еще получаю то же сообщение об ошибке? возможно ли, что что-то еще блокирует доступ. я имею в виду, это сработало 2 недели назад, когда я впервые попробовал это. так что я не знаю, почему его блокируют сейчас - person user3389187; 07.05.2014