使用jQueryAJAX和PHP创建智能远程上传脚本



我目前正在创建一个图像托管脚本,到目前为止还不错。我已经使用了几个插件来创建本地上传过程,并使用drag&drog+AAJAX,它工作得很好。现在我转到了需要使用jQueryAJAX和PHP脚本创建远程上传过程以处理整个过程的部分。

它将如何工作

我的想法是这样的:页面中间有一个大框,它接受要远程上传的URL。一旦有效的URL被传递到文本区域,它们将立即通过jQueryAJAX发送到服务器端脚本。它与keyup事件绑定。

这就是它的样子:https://i.stack.imgur.com/DNBFT.png.
"HERE COME The URLS"部分已经是一个文本区域-所以该部分已经完成。


我需要帮助的地方

整个情况的问题是:一旦有有效的URL粘贴到文本区域,就必须立即将其转换为某种框,其中还包括上传进度。看起来像这样的东西(从本地上传部分复制):https://i.stack.imgur.com/5YleJ.png

实现本地上传的进度指示器很容易,因为这是我使用的插件提供的功能,但我不知道如何指示远程上传的进度,这完全是从头开始的。

这就是我想象的逻辑流程:

  1. 用户将一些URL粘贴到文本区域
  2. 有一个客户端检查来验证粘贴的URL
  3. 已验证的URL将发送到keyup(?)上的upload.php
  4. 正在处理URL
  5. 在上传过程中,我们向用户显示旋钮的进度(?)
  6. PHP脚本完成该过程并返回上传的URL
  7. 我在AJAX success回调中更新页面以显示上传的文件

因此,我不清楚标记为(?)的两个流程-我不知道如何实现这些。。。


我尝试过的

好吧,我不是来这里要求你为我做一切的,但我遇到了一条死胡同,我不知道如何继续。到目前为止,我所做的是从文本区域收集URL,如果有多个用换行符(n)分隔的URL,我只需使用split来获得粘贴的文本数组,然后在循环中使用另一个函数来验证它们是否是URL。如果在文本区域值内没有检测到换行符,那么我只需检查提供的一行。在每种情况下,我都会将整个文本区域发送到PHP脚本,因为我不知道如何清除jQuery中的无效URL。我在PHP中创建了一个名为debug()的函数,它将任何内容存储到debug.log文件中,这就是我在将某些内容粘贴到文本区域时(一次尝试)得到的结果:

https://www.google.com/https://www.google.com/

我在文本区域粘贴了一次https://www.google.com/,但它在PHP端被记录了两次,我无法确定原因。

这就是我的jQuery的样子:

// Remote upload
    var char_start  = 10;
    var index       = 0;
    var urls        = $('.remote-area');
    var val_ary     = [];
    urls.keyup(function(){      
        if (urls.val().length >= char_start)
        {           
            var has_lbrs = /r|n/i.test(urls.val());
            val_ary = urls.val().split('n');
            if (has_lbrs)
            {
                for (var i = 0; i < val_ary.length; i++)
                {
                    if (!validate_url(val_ary[i]))
                    {
                        val_ary.splice(i, 1);
                        continue;   
                    }       
                }
                $.ajax({
                    type: 'POST',
                    url: 'upload.php',
                    data: {
                        upload_type: 'remote', // Used to determine the upload type in PHP
                        urls: val_ary, // Sending the whole array here
                    },
                });
            }
            else
            {
                if (!validate_url(urls.val()))
                {
                    // Display an error here
                    return; 
                }
                $.ajax({
                    type: 'POST',
                    url: 'upload.php',
                    data: {
                        upload_type: 'remote', // Used to determine the upload type in PHP
                        urls: urls.val(), // Sending what's in the text area
                    },
                });
            }
        }
    });

问题

所以最后的问题是:

  • 如何将我的信息正确发送到PHP脚本,只有有效的URL,并在我的PHP脚本中让它们"可处理"
  • 如何指示上传进度

如果我在提问中有不清楚的地方,请告诉我,我会尽力重新解释

谢谢。


更新

2013年12月9日

我想我已经解决了双重发送问题,我的AJAX会向PHP脚本发送两次相同的信息。我所做的是一个延迟匿名函数中的代码,该函数在用户停止键入2秒后将文本区域内容发送到PHP脚本。一旦用户再次停止键入,计时器就会重置,并发出新的AJAX请求。所以,我认为这个问题已经解决了。如果有什么奇怪的事情发生,我会回来的。

现在我仍然只剩下进度指标部分。我很感激你对此的看法。

我的新代码:http://pastebin.com/SaFSLeE9

在来回沟通进度方面,您想要的是"推动"。这指的是服务器向客户端发送数据的技术,而不是相反的技术,这是标准的HTTP方式。

正如维基百科的解释性文章中所描述的,你有很多选择,尽管彗星可能与这个主题更相关。发生的情况是,您触发了$.ajax调用,就像现在的调用一样,但您设置了很长的超时。这本质上为服务器提供了一个"通道",只要数据可用,就可以将其发送回页面。

因此,您需要的是服务器上的.php,它能够处理长时间轮询,并将随着上传进度的变化将数据发送回页面(可能是多次上传的数组形式)。这篇文章应该会让您开始学习一些jQuery代码。请记住,此请求不会转到upload.php。这个请求转到另一个脚本,该脚本只处理上传百分比,并且只在可用时返回数据,它不会像所有其他脚本那样立即返回——Ajax会很乐意等待数据。

另外,不要用has_lbrs那样分离代码。一行或多行不是不同的情况,一行只是多行的边缘情况。你在不必要地复制代码。else案例做了什么,在一般情况下会被打破?此外,else案件中的"错误处理"具有误导性。你所做的唯一错误报告是如果只有一行是错误的。如果你有两条线,它们都错了怎么办?您的代码将很乐意向upload.php发送一个空数组。

这就是为什么我认为你不应该这样分离你的代码,因为那样你就会分离逻辑,甚至不会注意到它。

在我看来,最好的方法是用ajax调用你的cURL脚本,并用它在远程服务器上上传你的文件。您需要在应用服务器上使用ajax.js、curl.php、index.php(无论您想要什么名称)。以及远程服务器上的image.php、class.image.php(无论您想要什么名称)。

我为我的应用所做的步骤

1) 我将从我的index.php文件上传一张图片。它将使用ajax.js调用curl.php文件,curl文件将检查文件的扩展名和所有内容(为了应用程序的安全,请确保您希望允许用户上传的内容)。

2) 现在,curl文件将使用默认文件名将文件上传到预先定义的临时文件夹中。

3) 现在,如果move_uploaded_file函数(我在脚本中使用了它)成功运行,您可以调用cURL函数将您的数据作为帖子发送到远程服务器上,图像文件将在远程服务器上接收帖子并进行进一步处理。您可以将类保存在image.php中,也可以根据需要在远程服务器上创建两个php文件。

4) 现在,在类文件中,您应该再次检查该文件是否为图像文件(以及您希望允许的任何内容),以获得更好的安全性。若文件是好的,处理重命名它,并添加文件到文件夹,若你们想。

5) 使用远程数据库连接将文件的新名称和文件夹名称添加到数据库中。因此,cURL将在同一页面上显示结果。

现在,为什么选择cURL?我更喜欢cURL,因为您可以添加密钥或API进行通信,使其更安全,并具有if-else条件。您的远程服务器文件将接收所有帖子,将检查API是否="yourKey",然后将处理它不会处理的其他方式,没有人能够在您的服务器上发送带有机器人的图像。

我不知道我的答案是否会对你有帮助,可能我的方法很长,或者对你的应用程序不好,但试着用谷歌搜索cURL,你就会明白我想说什么。希望你喜欢并理解它。如果有任何疑问,你可以随时问我。

相关内容

最新更新