【发布时间】:2013-12-25 13:42:21
【问题描述】:
我目前正在创建一个图像托管脚本,到目前为止一切顺利。我已经使用了几个插件来创建本地上传过程,使用拖放 + AJAX 完全可以正常工作。现在我已经转移到需要使用 jQuery AJAX 和 PHP 脚本创建远程上传过程来处理整个事情的部分。
它是如何工作的
我的想法是这样的:页面中间有一个大框,接受要远程上传的 URL。一旦 有效 URL(s) 被传递到文本区域,它们将立即通过 jQuery AJAX 发送到服务器端脚本。它与 keyup 事件绑定。
看起来是这样的: http://i.imgur.com/NhkLKii.png。
“HERE COME THE URLS” 部分已经是一个文本区域 - 所以该部分已经完成。
我需要帮助的地方
整个情况的问题是:一旦有有效的 URL 粘贴到文本区域,必须立即将它们转换为某种类型的框,其中还包括上传进度。看起来像这样的东西(从本地上传部分复制):http://i.imgur.com/q7RyDmb.png
本地上传的进度指示器很容易实现,因为这是我使用的插件提供的功能,但是我不知道如何指示远程上传的进度 ,完全是从零开始制作的。
这就是我想象的逻辑流程:
- 用户将一些 URL 粘贴到文本区域中
- 有一个客户端检查来验证粘贴的 URLs
- 经过验证的 URL 被发送到 upload.php
keyup(?) - 网址正在处理中
- 在上传过程中,我们会在 knob (?) 中向用户显示进度
- PHP 脚本完成该过程并返回上传的 URL
- 我在 AJAX
success回调中更新页面以显示上传的文件
所以,我不清楚标有 (?) 的两个流程 - 我不知道如何实现这些...
我尝试过的
嗯,我不只是来这里要求你为我做一切,但我遇到了一个死胡同,我不知道如何继续。到目前为止,我所做的是从文本区域收集 URL,如果有多个 URL 由换行符 (\n) 分隔,我只需使用 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 年 9 月 12 日
我想我已经设法解决了双重发送问题,即我的 AJAX 会将相同的信息两次发送到 PHP 脚本。我所做的是延迟匿名函数中的代码,该函数将文本区域内容发送到 PHP 脚本在用户停止输入 2 秒后。一旦用户再次停止输入,计时器就会重置并且会发出新的 AJAX 请求。所以,我假设这个问题已经解决了。如果有什么奇怪的事情我会回来的。
现在我还剩下进度指示器部分。非常感谢您对此的看法。
我的新代码: http://pastebin.com/SaFSLeE9
【问题讨论】:
-
唯一能正确格式化 Stack Overflow 问题的人。让我在这里都泪流满面
-
URL 是否可能因为发送了两次而被记录了两次?绑定到
keyup可能会在输入网址时发送网址。要检查 url 的有效性,您可以通过 jQuery 发出 HEAD 请求以检查它是否有效(HEAD 仅返回标头,而不是文件)。缓存您已经检查/发送的所有网址可能是个好主意。
标签: javascript php jquery html ajax