我搜索了一个从url下载文件到服务器的脚本,我遇到了这个脚本。它工作正常,但我想添加一些东西,如多个网址和进度条。因为我是php的新手,所以我知道一点。
以下是我要实现的脚本:
<html>
<form method="post">
<input name="url" size="50" />
<input name="submit" type="submit" />
</form>
<?php
// maximum execution time in seconds
set_time_limit (24 * 60 * 60);
if (!isset($_POST['submit'])) die();
// folder to save downloaded files to. must end with slash
$destination_folder = 'downloads/';
$url = $_POST['url'];
$newfname = $destination_folder . basename($url);
$file = fopen ($url, "rb");
if ($file) {
$newf = fopen ($newfname, "wb");
if ($newf)
while(!feof($file)) {
fwrite($newf, fread($file, 1024 * 8 ), 1024 * 8 );
}
}
if ($file) {
fclose($file);
}
if ($newf) {
fclose($newf);
}
?>
</html>
答案 0 :(得分:0)
对于多个链接,您可以告诉用户输入所有用逗号分隔的链接。然后你可以创建一个带有这些链接的数组(使用explode函数)并循环遍历它,直到你从链接下载所有文件。代码如下:
<html>
<form method="post">
<input name="url" size="50" />
<input name="submit" type="submit" />
</form>
<?php
// maximum execution time in seconds
set_time_limit (24 * 60 * 60);
if (!isset($_POST['submit'])) die();
// folder to save downloaded files to. must end with slash
$destination_folder = 'downloads/';
$urls = $_POST['url']; // I changed this variable's name to urls
$links = explode(",",$urls); // links is now an array with the links
foreach ($links as $url)
{
$newfname = $destination_folder . basename($url);
$file = fopen ($url, "rb");
if ($file) {
$newf = fopen ($newfname, "wb");
if ($newf)
while(!feof($file)) {
fwrite($newf, fread($file, 1024 * 8 ), 1024 * 8 );
}
}
if ($file) {
fclose($file);
}
if ($newf) {
fclose($newf);
}
}
?>
有用的链接:
如果您想要显示另一个输入框,则必须使用javascript,这有点复杂。但如果你愿意,我也可以这样向你展示。
对于进度条,您需要javascript和css Bootstrap。我正在尝试创建一个能够满足您需求的代码。如果我设法这样做,我会在这里上传,所以你可能想稍后再回来查看。
答案 1 :(得分:0)
由于您希望能够在此处显示新的输入框,因此代码为:
<html>
<form method="post">
<input type="text" id="input1" name="input1" size="50" />
<div id="new"></div>
<br><input type="button" value="+" onclick="writeBtn();"><br><br>
<input name="submit" value="Download" type="submit" />
</form>
<script type="text/javascript">
url_id=1;
function writeBtn()
{
if (document.getElementById("input"+url_id).value != "")
{
url_id++;
var input = document.createElement("input");
input.type="text";
input.id="input"+url_id;
input.name="input"+url_id;
input.size="50";
input.required=true;
var br1 = document.createElement("br");
var br2 = document.createElement("br");
setTimeout(function(){
$(input).click();
},200);
document.getElementById('new').appendChild(br1);
document.getElementById('new').appendChild(input);
document.getElementById('new').appendChild(br2);
}
else
{
alert("Please complete the last url first.");
}
}
</script>
<?php
// i have just added this maximum execution time in seconds
set_time_limit (0);
function downloadFromUrl($url, $destination)
{
$newfname = $destination . basename($url);
$file = @fopen ($url, "rb");
if ($file)
{
$newf = fopen ($newfname, "wb");
if ($newf)
while(!feof($file))
{
fwrite($newf, fread($file, 1024 * 8 ), 1024 * 8 );
}
// and replaced this with if command
if ($file) {
fclose($file);
}
if ($newf) {
fclose($newf);
}
return true;
}
else
{
return false;
}
}
if (!isset($_POST['submit'])) die();
// folder to save downloaded files to. must end with slash
$destination_folder = 'downloads/';
for ($i=1; isset($_POST["input".$i]); $i++)
{
$url = $_POST["input".$i];
if(downloadFromUrl($url, $destination_folder))
echo "<br>Succesfully Downloaded from: ".$url;
else
echo "<br>Error Downloading from: ".$url;
}
?>
说明:
在html表单中有一个id =“new”的div。在这个div中,当单击带有+号的按钮时,动态添加输入框。如果您想了解有关如何实现这一目标的更多信息,请访问以下链接:http://www.w3schools.com/jsref/met_document_createelement.asp。输入框中的值是按名称访问的,这些名称是input1,input2等。对于这个动态名称,给出变量url_id用于javascript部分,并为每个新输入框增加。此外,我添加了一项功能,如果最后一个输入为空并且提醒消息,则不允许用户创建新输入。 if语句是:
if (document.getElementById("input"+url_id).value != "")
所以,如果你不想这只是删除这一行和else块。为简单起见,我还在函数downloadFromUrl中包含了下载代码,如果成功下载文件则返回true,否则返回false。在php部分中有一个for循环,它解析所有输入,下载url中的文件,如果通过调用函数downloadFromUrl成功下载,则回显一条消息。
关于进度条的其他问题,我花了一整天的时间来寻找解决方案。长话短说,我无法使它工作,我认为它不可能奏效。我会解释你为什么。从php我们无法更改进度条的值,因为php已执行,然后在屏幕上打印所有结果,因此我们只会对进度条的最后一次更改始终为100%。另一种方法是使用javascript。在这种情况下,我们必须从javascript下载文件,因为如果我们从php下载它们,到javascript开始执行时,文件将已经从php下载。即使我们从下载文件的javascript执行php脚本,我们也无法判断何时下载文件,因此我们无法在适当的时间更新进度条。还剩下什么?使用XMLHttpRequest从javascript下载文件,这是由于两个原因无法实现的。首先,浏览器出于安全原因不允许这样做,其次,最重要的是你无法从javascript将文件上传到服务器,因为javascript是一种客户端语言,无法访问服务器。
你可以看到我尝试了很多方法。如果有人找到了这样做的方法,请告诉我。我希望我帮助你完成你的项目。对于任何问题,问题,答案的前半部分的错误以及答案第二部分的建议或更正都是非常受欢迎的。
答案 2 :(得分:0)
对于进度条,我已经花了一些时间。有两种方法。在txt / Database文件中存储远程文件的总大小,然后每次进行比较。或者您可以实时使用AJAX。希望如果有人能够应用这些想法将分享。