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

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

  • Tozix

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

    Spritz 22 августа 2011 г. 5: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 г. 5:46, спустя 2 минуты 27 секунд

    попробуй сохранять в сесиию
    С возвращением, Пiха!
  • TRIAL

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Spritz 22 августа 2011 г. 11: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 г. 12:21, спустя 58 минут 57 секунд

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

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