2015-04-22 1 views
2

Мне нужна помощь, пожалуйста.AJAX Загрузить веб-приложение

Я пытаюсь создать веб-приложение для загрузки ajax с нуля как личное хобби. Я смог получить файлы для загрузки в папку для загрузки успешно, но я просто не могу заставить загруженные ссылки появляться в окне загрузки и оставаться там постоянно даже после обновления веб-страницы.

я получаю сообщение об ошибке в консоли хром браузер Google:
Uncaught TypeError: Не удается прочитать свойство «длина» неопределенной

и он указывает мне на эту линию в index.php:
для (х = 0; х < data.succeeded.length; х = х + 1) {

также хром консоль Google отмечает это как (анонимные функции) в upload.js файла:
o.options.finished (прислал) ;

Я использовал видеоролики youtube в качестве руководства, но я просто не могу понять это.

Пожалуйста, помогите мне, пожалуйста

Это код index.php и ниже код upload.php также код upload.js.

<!DOCTYPE html> 
<html> 
    <head> 
     <meta charset="UTF-8"> 
     <title>Uploader</title> 
     <link rel="stylesheet" href="css/global.css"> 
    </head> 
    <body> 
     <form action="upload.php" method="post" enctype="multipart/form-data" id="upload" class="upload"> 
      <fieldset> 
       <legend>Upload files</legend> 
       <input type="file" id="file" name="file[]" required multiple> 
       <input type="submit" id="submit" name="submit" value="Upload"> 
      </fieldset> 

      <div class="bar"> 
       <span class="bar-fill" id="pb"><span class="bar-fill-text" id="pt"></span></span>  
      </div> 

      <div id="uploads" class="uploads"> 
       Uploaded file links will appear here.   
      </div> 

      <script src="js/upload.js"></script> 
      <script> 

       document.getElementById('submit').addEventListener('click', function(e) { 
        e.preventDefault(); 

        var f = document.getElementById('file'), 
         pb = document.getElementById('pb'), 
         pt = document.getElementById('pt'); 

        app.uploader({ 
         files: f, 
         progressBar: pb, 
         progressText: pt, 
         processor: 'upload.php', 

         finished: function(data) { 
          var uploads = document.getElementById('uploads'), 
           succeeded = document.createElement('div'), 
           failed = document.createElement('div'), 

           anchor, 
           span, 
           x; 

          if(data.failed.length) { 
           failed.innerHTML = '<p>Unfortunately, the following failed:</p>'; 
          } 

          uploads.innerText = ''; 

          for(x = 0; x < data.succeeded.length; x = x + 1) { 
           anchor = document.createElement('a'); 
           anchor.href = 'uploads/' + data.succeeded[x].file; 
           anchor.innerText = data.succeeded[x].name; 
           anchor.target = '_blank'; 

           succeeded.appendChild(anchor); 
          } 

          for(x = 0; x < data.failed.length; x = x + 1) { 
           span = document.createElement('span'); 
           span.innerText = data.failed[x].name; 

           failed.appendChild(span); 
          } 

          uploads.appendChild(succeeded); 
          upload.appendChild(failed); 

         }, 

         error: function() { 
          console.log('Not working'); 
         } 
        }); 
       });    
      </script> 

     </form> 
    </body> 
</html> 

upload.php код

<?php 
header('Content-Type: application/json'); 

$uploaded = ''; 
$allowed = ''; 

$succedeed = ''; 
$failed = ''; 

if(!empty($_FILES['file'])) { 
    foreach($_FILES['file']['name'] as $key => $name) { 
     if($_FILES['file']['error'][$key] === 0) { 

      $temp = $_FILES['file']['tmp_name'][$key]; 

      $ext = explode('.', $name); 
      $ext = strtolower(end($ext)); 

      $file = md5_file($temp) . time() . '.' . $ext;   

       if(move_uploaded_file($temp, "uploads/{$file}") === true) { 
        $succedeed[] = array(
         'name' => $name, 
         'file' => $file 
        ); 
       } else { 
        $failed[] = array(
         'name' => $name 
        ); 
       }    
     } 
    } 

    if(!empty($_POST['ajax'])) { 
     echo json_encode(array(
     'succedeed' => $succedeed, 
     'failed' => $failed 
    )); 
    } 
} 

Это код upload.js

var app = app || {}; 

(function(o) { 
    "use strict"; 

    //Private methods 
    var ajax, getFormData, setProgress; 

    ajax = function(data) { 
     var xmlhttp = new XMLHttpRequest(), uploaded; 

     xmlhttp.addEventListener('readystatechange', function() { 
      if(this.readyState === 4) { 
       if(this.status === 200) { 
         uploaded = JSON.parse(this.response); 

         if(typeof o.options.finished === 'function') { 
         o.options.finished(uploaded); 
        } 
       } else { 
        if(typeof o.options.error === 'function') { 
         o.options.error(); 
        } 
       }    
      } 
     }); 

     xmlhttp.upload.addEventListener('progress', function(event) { 
      var percent; 

      if(event.lengthComputable === true) { 
       percent = Math.round((event.loaded/event.total) * 100); 
       setProgress(percent); 
      } 
     }); 

     xmlhttp.open('post', o.options.processor); 
     xmlhttp.send(data); 
    }; 

    getFormData = function(source) { 
     var data = new FormData(), i; 

     for(i = 0; i < source.length; i = i + 1) { 
      data.append('file[]', source[i]); 
     } 

     data.append('ajax', true); 

     return data; 
    }; 

    setProgress = function(value) { 
     if(o.options.progressBar !== undefined) { 
      o.options.progressBar.style.width = value ? value + '%' : 0; 
     } 

     if(o.options.progressText !== undefined) { 
      o.options.progressText.innerText = value ? value + '%' : ''; 
     } 
    }; 

    o.uploader = function(options) { 
     o.options = options; 

     if(o.options.files !== undefined) { 
      ajax(getFormData(o.options.files.files)); 
     } 
    } 

}(app)); 
+0

Вы можете получить пустые данные, если ваш $ _POST [ «Аякса»] пусто. В этом случае ваш PHP-скрипт ничего не возвращает. Таким образом, вы можете получить пустую переменную «данные». Проверьте свой запрос и ответ. Поэтому вы можете найти, где вы ошибаетесь. Вы можете поделиться запросом и ответом здесь, чтобы помочь нам найти правильный ответ. – Panoptik

+0

http://stackoverflow.com/questions/24446281/passing-image-using-ajax-to-php/24446611#24446611 это может вам помочь – AkshayP

+0

@Panoptik Я посмотрел на запрос и ответ, как вы сказали. Я видел, что консоль Google Chrome помечена этой строкой как (анонимная функция) в файле uploads.js ...... o.options.finished (загружен); ....... –

ответ

1

Я думаю, что проблема связана с если (move_uploaded_file ($ темп, «загрузки/{$ file} ") === true) try if (move_uploaded_file ($ temp," uploads/{$ file} ") == true)

, а также проверить data.succedeed заклинание в index.php

+0

Это было бы так же, как 'if (move_uploaded_file ($ temp," uploads/{$ file} "))'.[move_uploaded_file] (http://php.net/manual/en/function.move-uploaded-file.php) в любом случае вернет 'true' или' false'. – skobaljic

+0

да, но на самом деле, когда вы повторяете это, он вернет 1 или 0. так что не ходите на тип, просто проверьте значение – syms

+0

@syms OMG ...... Я неправильно написал «succedeed» ...... что была проблема все время ...... Большое спасибо, но как я могу заставить файлы продолжать отображаться в div ниже поля для загрузки после обновления страницы. Каждый раз, когда я обновляю страницу, загруженные файлы, отображаемые в div ниже поля для загрузки, исчезают. Можете ли вы помочь мне в этом вопросе, пожалуйста? –

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