1

ここで質問するのはこれが初めてだと言わざるを得ません。私は開発者ではないので、知識が不足していることをご容赦ください。この要件は、私が何人かの友人と作成している Web サイトのためのものであるため、これでお金を稼いでいるわけではありません。

これが問題です。Rapidshare や他のファイル共有サービスと同じように、ダウンロードに何らかの制限を実装したいと考えています。

  1. ユーザーは同時に 1 つのファイルのみをダウンロードできる必要があります

  2. ユーザーは、別のファイルをダウンロードできるようになるまで、たとえば 2 時間待つ必要があります。

ただし、ファイル共有 Web サイトを作成しようとしているわけではありません。すべてのファイルを Amazon S3 にアップロードしますが、必要なのはダウンロードを制限できることだけです。ファイルへのリンクを作成します。ユーザーが登録されているかどうかは気にしません。とにかくダウンロードできるはずです。

Web サイトは、Apache + MySQL を使用する Joomla! で構築されています。ファイルは Amazon のサーバーに配置されます。

私の質問は次のとおりです。それほど複雑ではない方法でこれを実装する方法はありますか? これを行うのに役立つスクリプトまたは Web サービスを知っていますか?

私は周りを見回しましたが、私が見つけた唯一のものは支払いゲートウェイであり、ダウンロードに課金する予定はありません.

どんな助けでも大歓迎です。

ありがとう!

更新: このスクリプトを使用してこの問題を解決しました: http://www.vibralogix.com/linklokurl/features.php

4

4 に答える 4

1

私の知る限り、S3 からのダウンロードの現在のステータスを確認する方法はありません。そうは言っても、S3 は実際に十分な帯域幅を利用できるので、サーバーの過負荷についてあまり心配する必要はありません :) 先週、Amazon は、S3 が現在平均 650,000 オブジェクト/秒を処​​理していると発表しました。

PHP で @Pushpesh のソリューションのようなものを実装したい場合、1 つの解決策は、Amazon SDK for 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 関数を使用します。この関数は、S3 で非公開に設定したファイルを公開せずに他のユーザーがダウンロードできるようにする署名付き URL を生成します。

ご覧のとおり、これが生成するリンクは 10 分間のみ有効で、一意のリンクです。したがって、人々がリンクを拡散することを心配することなく、このリンクから人々が安全にダウンロードできるようにすることができます。リンクは期限切れになります。人々が新しい有効なリンクを取得できる唯一の方法は、ダウンロード スクリプトを実行することです。これは、ダウンロードを開始しようとしている IP/ユーザーが既に使用制限を超えている場合、新しいリンクの生成を拒否します。ただし、これらのファイルを S3 で非公開に設定することが重要です。これらのファイルを公開すると、あまり効果がありません。これらの署名付き URL を生成する S3 APIのドキュメントも参照してください。

于 2012-04-10T10:30:56.830 に答える
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

これは非常に基本的な実装です。もっと堅牢な方法が存在すると確信しています。お役に立てれば。

于 2012-04-10T10:16:29.300 に答える
0

私の頭に浮かぶのは2つの方法だけです-一意のハッシュでファイルをコピーし、Apacheにそれを提供させる..その後、ユーザーが実際にダウンロードを終了する(または開始する)タイミングを制御できません。大きなファイルに便利です。別の方法は、php を介して渡すことです。それでも、ユーザーがダウンロードを停止した場合に備えて、ダウンロード セッションを強制終了する必要があります。

于 2012-04-10T10:09:31.840 に答える
0

そのためのプラグインがない場合、スクリプトを追加するか、「いくつかの」コードをコピーして貼り付けるという簡単な方法では実行できません。

したがって、誰かを雇うか、自分でタスクに取り組むために必要なことを学ぶ必要があります。つまり、プログラミングの方法を学ぶ必要があります。あなたの質問には、実装する必要がある手順が既に含まれています。誰が何をいつダウンロードしているかを記録し、ダウンロードのステータスを追跡します。

以前にダウンロード ステータスを追跡しようとしたことはありませんが、ファイルを送信しているサーバーから何らかの方法で直接ステータスを取得できるかどうかはわかりません。ただし、クライアントから取得できます: PHP と JavaScript を使用したダウンロード ステータス

ファイルは S3 から取得されるため、これがシナリオで適切に機能するかどうかはさらにわかりません。

S3 自体には、いわゆる「クエリ文字列保護」という機能があります。

クエリ文字列認証を使用すると、事前定義された有効期限まで有効な URL を介して Amazon S3 オブジェクトを共有できます。

したがって、これを実装する方法を理解するには、S3 API を検索する必要があります。

ユーザーがダウンロードリンクをクリックしたときに ajax リクエストをサーバーに送信し、サーバーが生成した amazon s3 リンクを応答として送信し、クライアント側の JavaScript に何らかの方法でそのファイルのダウンロードをトリガーさせることができます。

于 2012-04-10T10:10:05.073 に答える