上传文件,只允许某些用户下载(LARAVEL)

时间:2016-06-28 03:31:55

标签: php laravel

所以我需要用户上传文件。然后,客户(非用户)可以购买这些文件。一旦付款被条带处理,买家就会收到一封带有下载文件链接的电子邮件。我需要的是这些文件的下载链接,仅供上传文件的用户和客户使用谁买了这个文件。

这是我的控制器,用于处理用户填写的表单以上传文件。 NonUser是以前表单中文件的详细信息。

    $note = new Note;
    $note->title = $nonUser->title;
    $note->description = $nonUser->description;
    $note->mark = $nonUser->mark;
    $note->page_count = $nonUser->page_count;
    $note->subject_id = $nonUser->subject_id;
    $note->year = $nonUser->year;
    $note->modules = $nonUser->modules;
    $note->price = $nonUser->modules*25;
    $note->user_id = $user->id;
    $note->exam_id=$user->exam_id;
    $note->save();

     Storage::put(
    'notes/' . $note->id . '.pdf',
    file_get_contents($request->file('notes')->getRealPath())
    );

我的条纹处理。

public function charge()
{
        $nid = Session::get('nid');
        $note = Note::where('id','=',$nid)->first();
        $price = $note->price;

        \Stripe\Stripe::setApiKey("sk_test_key");

        $token = $_POST['stripeToken'];

        try {
          $charge = \Stripe\Charge::create(array(
            "amount" => $price*100, // amount in cents, again
            "currency" => "aud",
            "source" => $token,
            "description" => "Example charge"
            ));
        } catch(\Stripe\Error\Card $e) {
            flashWarning('An error occured');
            return back();
        }

        flash('payment succesful! Check your email for a download link!');
        return back();
}

3 个答案:

答案 0 :(得分:1)

我会使用以下步骤为买家提供服务:

  1. 付款成功后,将orderIDfileID(应与所有文件的主键匹配,存储在不同的表中)存储在数据库中,随机散列为{{1 ,DateTime为download_ticket,以及该票据用作ticket_expiration的次数

  2. 通过电子邮件向买家发送指向php脚本的下载链接。该脚本应该期待下载票证。例如:

    example.com/download.php?ticket=m54hm4j390534gi2frew0094

  3. 在脚本download_count中,您将执行以下操作:

    1. 从查询字符串中获取彩票:download.php
    2. 在数据库中获取记录:$ticket = $_GET['ticket']
    3. 如果没有匹配项,则SELECT * from tbl WHERE ticket=m54hm4j390534gi2frew0094错误404 not found并中止。
    4. 如果http_response_code(404)已过,请删除记录,错误ticket_expiration并中止。
    5. 如果403 forbidden超出限制,请删除记录,错误download_count并中止。
    6. 使用429 too many requests列查找已购买的文件
    7. 如果所有检查锻炼,您可以将文件发送给用户。 将用户重定向到文件的真实位置。相反,做一些像:

      fileID

答案 1 :(得分:0)

成功处理付款后,将文件上传的PK(来自您的数据库)存储在新表中(让我们称之为购买下载)以及可用于查找文件的唯一令牌& #39;该表中的PK。这将是您发送的令牌以及他们下载文件的电子邮件。

创建一个新的控制器,接受此令牌并在购买的下载表中查找唯一令牌,然后您可以使用类似X-Sendfile标头的内容让您的网络服务器通过您的文件系统将文件提供给客户端如果令牌验证。如果您愿意,也可以在此令牌上设置到期时间。

答案 2 :(得分:0)

您可以通过以下方式执行此操作

第1步:生成链接

完成后

Storage::put(
    'notes/' . $note->id . '.pdf',
    file_get_contents($request->file('notes')->getRealPath())
    );

使用

生成链接
$data['link'] = URL::to('/notes/'.$note->id.'pdf'); //Modify path according to your need
$message = 'Your Custom HTML';

第2步:发送电子邮件

向上传用户的用户发送邮件

   Mail::send(email.file, function ($message) {
    $message->from('youremail@example.com', 'File Received');
    $message->to(Auth::user()->email); // Email id of one who uploads it
});

触发购买该文件的邮件

   $userlist = User::where('file_id' , $fileid)->get(); //modify the condition according to the tables you have
   foreach($userlist as $users)
   {
Mail::send(email.file, function ($message) {
        $message->from('youremail@example.com', 'File Received');
        $message->to($user['email']); // Looped Email id
    });
   }

附加步骤:(确保文件安全)

不要直接指向文件,你可以这样做

  1. 生成像这样的链接
  2. yourapp.com/pdf/12/143

    其中12是用户ID,143是pdf文件的id

    在您的控制器下,您可以检查ID为12的用户是否有权下载ID为143的文件,如果是,则生成pdf视图或将其下载给用户。

    希望这有助于你