【问题标题】:AJAX Upload Web AppAJAX 上传网页应用
【发布时间】:2015-04-22 10:49:59
【问题描述】:

我需要一些帮助。

我正在尝试从头开始创建一个 ajax 上传网络应用程序作为个人爱好。 我能够成功地将文件上传到我的上传文件夹,但我似乎无法让上传的链接出现在上传框下,并且即使在刷新网页后也永久保留在那里。

我在 google chrome 浏览器控制台中不断收到此错误消息:
Uncaught TypeError: Cannot read property 'length' of undefined

它指向 index.php 中的这一行:
for(x = 0; x
此外,谷歌浏览器控制台在 upload.js 文件中将其标记为(匿名函数):
o.options.finished(uploaded);

我曾使用一些 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>

上传.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));

【问题讨论】:

  • 如果您的 $_POST['ajax'] 为空,您可以获得空数据。在这种情况下,您的 PHP 脚本什么也不返回。所以你可以得到空的“数据”变量。检查您的请求和响应。所以你可以找到你错的地方。您可以在此处分享请求和响应,以帮助我们找到正确的答案。
  • stackoverflow.com/questions/24446281/… 这可能对你有帮助
  • @Panoptik 我看了你说的请求和响应。我看到谷歌浏览器控制台在uploads.js文件中将此行标记为(匿名函数)...... o.options.finished(uploaded); .......
  • @A.P.我查看了您的链接,代码非常不同。请指出我应该看的地方。
  • @Panoptik 请原谅我,但我还是有点失落。

标签: javascript php jquery ajax html


【解决方案1】:

我认为问题是由于 if(move_uploaded_file($temp, "uploads/{$file}") === true) 尝试 if(move_uploaded_file($temp, "上传/{$file}") == true)

并检查 index.php 中的 data.succedeed 拼写

【讨论】:

  • 这与if (move_uploaded_file($temp, "uploads/{$file}")) 相同。 move_uploaded_file 无论如何都会返回 truefalse
  • 是的,但实际上当你回显它时它会返回 1 或 0。所以不要去输入只是检查值
  • @syms OMG......我拼错了“succedeed”......这一直是问题......非常感谢,但我该怎么做刷新页面后,让文件继续显示在上传框下方的 div 中。每次我刷新页面时,上传框下方 div 中显示的上传文件都会消失。你能帮我解决这个问题吗?
  • 刷新后无法将数据保存在变量中,为此您必须使用 cookie 或 localstorage 来存储文件名,如果它存在于 localstorage 或 cookie 中,则将它们附加到文档准备好的 div 中。
  • @syms 谢谢,我会尝试本地存储或创建一个 .appcache 文件,这样应用程序就可以离线使用,也可以自动将副本放在本地计算机上。我会让你知道这是如何工作的。如果可行,我会将这个问题标记为已解决。
猜你喜欢
  • 2016-01-18
  • 2012-01-12
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多