2012-04-10 61 views
1

我必须说这是我第一次在这里问任何东西,而且我不是开发人员,所以请耐心等待我的知识缺乏。这个要求是针对我和一些朋友创建的网站,所以这并不是我用这个赚钱。1同步下载+强制等待时间+亚马逊S3

这是问题:我想实施某种限制,以下载,以同样的方式RAPIDSHARE或任何其他文件共享服务非常多的功能:

  1. 用户应该能够只下载1文件

  2. 用户应该等下一个文件,比如说2小时。

但是,我不是想创建一个文件共享网站。我打算将所有文件上传到Amazon S3,我唯一需要的是能够限制下载。我将创建指向文件的链接。我不在乎用户是否注册,他们应该可以下载。

该网站建在Joomla !,它使用Apache + MySQL。这些文件将位于亚马逊的服务器上。

我的问题是以下。有没有什么办法可以用一种不那么复杂的方式来实现呢?你知道一些脚本或网络服务可以帮助我完成这件事吗?

我环顾四周,但唯一发现的是支付网关,我们不打算为下载收费。

任何帮助将不胜感激。

谢谢!

更新:我使用这个脚本解决了这个问题:http://www.vibralogix.com/linklokurl/features.php

+0

呃,这听起来像是一个很好的方式来惹恼用户。 – ThiefMaster 2012-04-10 10:33:09

+0

是的,这就是主意。这基本上是为了给这些匪徒做更多的工作。 – 2012-04-10 14:06:17

回答

0

只有2种方式在我脑海中 - 你要么复制文件具有独特的哈希,让Apache处理它..然后你没有任何控制当用户实际结束他的下载(或开始)时结束。对于大文件很有用。另一种方法是通过PHP传递它。不过,如果用户停止下载,则需要终止下载会话。

0

如果没有插件,您将无法通过添加脚本或复制&粘贴“一些”代码来实现。

因此,无论是雇用某人,还是需要了解自己需要完成的任务,换句话说就是学习如何编程。您的问题已经包含您需要实施的步骤:记录谁在下载什么,何时下载并跟踪下载的状态。

我还没有尝试过跟踪下载状态,但我不确定是否可以直接从发送文件的服务器获取状态。但你可以从客户端得到它:Download Status with PHP and JavaScript

我进一步不确定这是否会在你的情况下正常工作,因为该文件将来自S3。

S3本身有一个所谓的功能“查询字符串保护”:

带查询验证,你必须通过有效的预定到期 时间的URL分享亚马逊 S3对象的能力。

因此,您需要查找S3 API来找出如何实现这一点。

你可以尝试的是,当用户点击下载链接时,发送一个ajax请求到你的服务器,发送你的服务器生成的亚马逊s3链接作为响应,并让客户端JavaScript以某种方式触发该文件下载。

+0

是的,我曾考虑过聘请某人来做这件事,但在此之前我想检查一下这件事的难易程度,以及是否已经创建了可以实施的解决方案。 关于查询字符串认证,我已经阅读了它,并且我有一个Joomla组件,它说它使用它来提供文件。但是,这一部分在完成其余部分时不足。 – 2012-04-10 13:53:55

+0

您可以'轻松'为您的文件生成有时间限制的URL,并使其在大约5分钟左右过期。然后,如果用户最近没有下载过,那么只能为用户制作一个有时间限制的URL。这意味着cookies和IP地址以及其他技巧 - 几个人通常共享一个IP,cookies可以被清除,并且人们可以尝试其他浏览器等。因此,独特的事情可能很难......您需要一个Ruby或PHP程序员等来做到这一点。 – 2012-04-10 17:44:17

0

您可以通过其IP地址监控用户下载,并将其与用户下载的时间以及会话ID(当然是哈希值)一起存储在数据库中,并在每次下载请求之前检查它。如果当前时间在同一个会话中小于2小时,请阻止请求,否则给他们下载。

表结构:

Id  Ip_Addr  Session_Hash Timestamp 
1  10.123.13.67 sdhiehh_09# 1978478656 
2  78.86.56.11 mkdhfBH&^#  1282973867 
3  54.112.192.10 _)*knbh  1445465565 

这是一个非常基本的实现。我敢肯定,更强大的方法存在。希望这可以帮助。

1

据我所知,没有办法检查从S3下载的当前状态。话虽如此,S3确实有足够的带宽可用,所以我不必担心过载服务器太多:)就在上周,Amazon announced S3现在平均每秒处理650,000个对象。

如果你想实现像在PHP @ Pushpesh的解决方案,一个解决方案是使用Amazon SDK的PHP和做这样的事情:

<?php 
#Generate presigned S3 URL to download S3 object from 

# Include AWS SDK for PHP and create S3 
require_once("./aws-sdk/sdk.class.php"); 

$s3 = new AmazonS3(); 

# Let S3 know which file we want to be downloading 
$s3_bucket_name = "yours3bucketname"; 
$s3_object_path = "folder1/object1.zip"; 
$s3_url_lifetime = "10 minutes"; 
$filename = "download.zip"; 

#Check whether the user has already downloaded a file in last two hours 
$user_can_download = true; 

if($user_can_download) { 
    $s3_url = $s3->get_object_url($s3_bucket_name, $s3_object_path, $s3_url_lifetime, array('response' => array('content-type' => 'application/force-download', 'content-disposition' => 'attachment; filename={$filename}'))); 
    header("Location: {$s3_url}"); 
} 
else { 
    echo "Sorry, you need to wait a bit longer before you can download a file again..."; 
} 
?> 

这使用get_object_url功能,生成预已签名的URL,允许其他人下载您在S3中设置为私有的文件,而不公开这些文件。

正如你所看到的,这个链接产生的链接只会有效10分钟,这是一个独特的链接。因此,您可以放心地让人们从此链接下载,而不必担心人们传播链接:链接已过期。人们获得新的有效链接的唯一方法是通过您的下载脚本,如果尝试启动下载的IP /用户已超出其使用限制,则该脚本将拒绝生成新链接。不过,在S3中将这些文件设置为私有文件非常重要:如果您将这些文件公开给其他用户,那么这并不会有太大好处。您可能还想看看生成这些预签名URL的S3 API的docs

+0

谢谢你的回答。事实上,这听起来正是我所需要的。我想我应该做很多研究,雇用一个非常有经验的人来做这件事,或者干脆使用Rapidshare。 另一方面,我知道亚马逊拥有大量的带宽,但我想通过这种方式实现的目标是阻止吸血鬼不停地下载数百个文件。我们不会为这些文件收费,因此很可能会发生这种情况。 – 2012-04-10 14:04:08

+0

您是否愿意下载适用于PHP的AWS开发工具包并将其放到您的Web服务器上?你在那个服务器上有一个可用的MySQL数据库吗?如果你能做到这一点,那么把'$ user_can_download = true'变成真正的支票并不会有太大的工作量。现在没有时间去做,但明天早上它可能是一个不错的早餐编码练习:)当然,使其万无一失,并将其与Joomla整合将需要相当长的时间,你真的不得不雇佣某人来做到这一点......但是@Pushpesh描述的一个简单的实现很容易组合起来 – Daan 2012-04-10 15:30:52