2012-04-10 62 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