ФорумПрограммированиеPHP для идиотов → PHP+Ajax массовая загрузка файлов.

PHP+Ajax массовая загрузка файлов.

  • Tozix

    Сообщения: 10 Репутация: N Группа: Кто попало

    Spritz 22 августа 2011 г. 2:44

    Есть такая замечательная штука http://valums.com/ajax-upload/ .
    Но я никак не могу с ней толком разобраться.

    Мой index.php(сделан по примеру в доках).
    <!DOCTYPE html>
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    	<link href="fileuploader.css" rel="stylesheet" type="text/css">
            <script src="fileuploader.js" type="text/javascript"></script>	
        <style>    	
       </style>	
    </head>
    <body>		
     <div id="upload">		
    		<noscript>			
    			<!– Пихаем сюда –>
    		</noscript>         
    	</div>
       <script>     
                function createUploader(){            
                     var uploader = new qq.FileUploader({
                    element: document.getElementById('upload'),
                    action: 'upload.php',
                    allowedExtensions: ['jpg', 'jpeg', 'png', 'gif'], 
                    debug: true
                });           
            }
            window.onload = createUploader;     
        </script>    
    </body>
    </html>
    

    Файл upload.php На который и идет экшен. (взять с примера без изменений).

    <?php
    
    /**
     * Handle file uploads via XMLHttpRequest
     */
    class qqUploadedFileXhr {
        /**
         * Save the file to the specified path
         * @return boolean TRUE on success
         */
        function save($path) {    
            $input = fopen("php://input", "r");
            $temp = tmpfile();
            $realSize = stream_copy_to_stream($input, $temp);
            fclose($input);
            
            if ($realSize != $this->getSize()){            
                return false;
            }
            
            $target = fopen($path, "w");        
            fseek($temp, 0, SEEK_SET);
            stream_copy_to_stream($temp, $target);
            fclose($target);
            
            return true;
        }
        function getName() {
            return $_GET['qqfile'];
        }
        function getSize() {
            if (isset($_SERVER["CONTENT_LENGTH"])){
                return (int)$_SERVER["CONTENT_LENGTH"];            
            } else {
                throw new Exception('Getting content length is not supported.');
            }      
        }   
    }
    
    /**
     * Handle file uploads via regular form post (uses the $_FILES array)
     */
    class qqUploadedFileForm {  
        /**
         * Save the file to the specified path
         * @return boolean TRUE on success
         */
        function save($path) {
            if(!move_uploaded_file($_FILES['qqfile']['tmp_name'], $path)){
                return false;
            }
            return true;
        }
        function getName() {
            return $_FILES['qqfile']['name'];
        }
        function getSize() {
            return $_FILES['qqfile']['size'];
        }
    }
    
    class qqFileUploader {
        private $allowedExtensions = array();
        private $sizeLimit = 10485760;
        private $file;
    
        function __construct(array $allowedExtensions = array(), $sizeLimit = 10485760){        
            $allowedExtensions = array_map("strtolower", $allowedExtensions);
                
            $this->allowedExtensions = $allowedExtensions;        
            $this->sizeLimit = $sizeLimit;
            
            $this->checkServerSettings();       
    
            if (isset($_GET['qqfile'])) {
                $this->file = new qqUploadedFileXhr();
            } elseif (isset($_FILES['qqfile'])) {
                $this->file = new qqUploadedFileForm();
            } else {
                $this->file = false; 
            }
        }
        
        private function checkServerSettings(){        
            $postSize = $this->toBytes(ini_get('post_max_size'));
            $uploadSize = $this->toBytes(ini_get('upload_max_filesize'));        
            
            if ($postSize < $this->sizeLimit || $uploadSize < $this->sizeLimit){
                $size = max(1, $this->sizeLimit / 1024 / 1024) . 'M';             
                die("{'error':'increase post_max_size and upload_max_filesize to $size'}");    
            }        
        }
        
        private function toBytes($str){
            $val = trim($str);
            $last = strtolower($str[strlen($str)-1]);
            switch($last) {
                case 'g': $val *= 1024;
                case 'm': $val *= 1024;
                case 'k': $val *= 1024;        
            }
            return $val;
        }
        
        /**
         * Returns array('success'=>true) or array('error'=>'error message')
         */
        function handleUpload($uploadDirectory, $replaceOldFile = FALSE){
            if (!is_writable($uploadDirectory)){
                return array('error' => "Server error. Upload directory isn't writable.");
            }
            
            if (!$this->file){
                return array('error' => 'No files were uploaded.');
            }
            
            $size = $this->file->getSize();
            
            if ($size == 0) {
                return array('error' => 'File is empty');
            }
            
            if ($size > $this->sizeLimit) {
                return array('error' => 'File is too large');
            }
            
            $pathinfo = pathinfo($this->file->getName());
            $filename = $pathinfo['filename'];
            //$filename = md5(uniqid());
            $ext = $pathinfo['extension'];
    
            if($this->allowedExtensions && !in_array(strtolower($ext), $this->allowedExtensions)){
                $these = implode(', ', $this->allowedExtensions);
                return array('error' => 'File has an invalid extension, it should be one of '. $these . '.');
            }
            
            if(!$replaceOldFile){
                /// don't overwrite previous files that were uploaded
                while (file_exists($uploadDirectory . $filename . '.' . $ext)) {
                    $filename .= rand(10, 99);
                }
            }
            
            if ($this->file->save($uploadDirectory . $filename . '.' . $ext)){
                return array('success'=>true);
            } else {
                return array('error'=> 'Could not save uploaded file.' .
                    'The upload was cancelled, or server error encountered');
            }
            
        }    
    }
    
    // list of valid extensions, ex. array("jpeg", "xml", "bmp")
    $allowedExtensions = array();
    // max file size in bytes
    $sizeLimit = 10 * 1024 * 1024;
    
    $uploader = new qqFileUploader($allowedExtensions, $sizeLimit);
    $result = $uploader->handleUpload('uploads/');
    // to pass data through iframe you will need to encode all html tags
    echo htmlspecialchars(json_encode($result), ENT_NOQUOTES);
          ?>


    Загрузка в папку upload идет прекрасно. Мне вот нужно каким-то чудом передать переменную в файл upload.php.
    Ну к примеру index.php?cat=2
    Получить гетом в самом index.php это не проблема, а вот передать его в upload.php я не знаю как.
    action: 'upload.php?cat=2', - таким образом то я не вопрос её получу в upload.php
    Вот собствено как впихать php переменную в JS
    action: 'upload.php?cat=<?=$cat;?>' Такой способ не проходит.

    Помогите пожалуйста и не судите строго, в JS я дуб дубом.
  • ivanscm

    Сообщения: 1251 Репутация: N Группа: Джедаи

    Spritz 22 августа 2011 г. 2:46, спустя 2 минуты 27 секунд

    попробуй сохранять в сесиию
    С возвращением, Пiха! hyperoff.ru - качественный хостинг php
  • TRIAL

    Сообщения: 988 Репутация: N Группа: Джедаи

    Spritz 22 августа 2011 г. 2:50, спустя 3 минуты 36 секунд

    А еще есть такая вещь - http://www.uploadify.com/
    from TRIAL with LOVE
  • Ivan

    Сообщения: 1316 Репутация: N Группа: Адекваты

    Spritz 22 августа 2011 г. 2:56, спустя 5 минут 57 секунд

    >Такой способ не проходит
    Почему? Если пользователь этот cat выбирает сам, то в передаче его через GET нету ничего страшного…

    Ежели твой js-класс каким-то образом режет GET запрос в action, то просто используй cookies
  • Tozix

    Сообщения: 10 Репутация: N Группа: Кто попало

    Spritz 22 августа 2011 г. 2:56, спустя 33 секунды

    Из Пыха в JS нормально передается, прошу прощения за тупость пытался обработать ПЫХ в html файле (веб сервере пых обрабатывается только с расширением .php).
    Тему можно закрыть.
  • AlexanderC

    Сообщения: 270 Репутация: N Группа: Кто попало

    Spritz 22 августа 2011 г. 4:56, спустя 2 часа 7 секунд

    да можно и в hhhhhtml обрабатывать… главное расширение зарегить…
  • Tozix

    Сообщения: 10 Репутация: N Группа: Кто попало

    Spritz 22 августа 2011 г. 8:22, спустя 3 часа 25 минут 43 секунды


    да можно и в hhhhhtml обрабатывать… главное расширение зарегить…


    Да это понятно, но нах… оно нужно, если все равно будет использоваться внутри PHP скрипта, а в html я просто мучал как и в примере.

    Вообще другая проблема возникла. С Выводом в DOM.

    имя загруженного файла выводится между тэгами <span class="qq-upload-file"></span> в формате example.png просто текстом, как вывести картинку.
    Естественно запись <img src="<span class="qq-upload-file"></span>"> не проканает.
    Перерыл весь JS, так и не нашел каким образом в DOM отыслается, введу того что дуб в JS

  • AlexanderC

    Сообщения: 270 Репутация: N Группа: Кто попало

    Spritz 22 августа 2011 г. 9:21, спустя 58 минут 57 секунд

    в jquery примерно так…
    $("#myLinkId").attr("src", $("#qq-upload-file").html());
    Спустя 41 сек.
    …т.е. для класса используется точка а не решётка…
    Спустя 13 сек.
    .qq-upload-file

Пожалуйста, авторизуйтесь, чтобы написать комментарий!