如何更改此PHP代码以允许随机下载链接生成?

时间:2014-12-26 01:26:35

标签: php

这个HTML表单和PHP允许用户上传文件,但是我应该添加什么来生成到用户可以下载此文件的页面的唯一链接(类似于megaupload的想法)?

HTML:

<form action="gogogo.php" method="post" enctype="multipart/form-data">

  <label class="filebutton" for="file">Upload </label> 
  <input type="file" name="userfile" id="file" onChange="form.submit()"> <br />

</form>

PHP:

<?php
// Configuration - Your Options
  $allowed_filetypes = array('.jpg','.gif','.bmp','.png', '.txt'); 
  $max_filesize = 524288; // Maximum filesize in BYTES (currently 0.5MB).
  $upload_path = 'files/'; 
  $filename = $_FILES['userfile']['name']; 
  $ext = substr($filename, strpos($filename,'.'), strlen($filename)-1); 

  // Check if the filetype is allowed, if not DIE and inform the user.
  if(!in_array($ext,$allowed_filetypes))
    die('The file you attempted to upload is not allowed.');

  // Now check the filesize, if it is too large then DIE and inform the user.
  if(filesize($_FILES['userfile']['tmp_name']) > $max_filesize)
    die('The file you attempted to upload is too large.');

  // Check if we can upload to the specified path, if not DIE and inform the user.
  if(!is_writable($upload_path))
    die('You cannot upload to the specified directory, please CHMOD it to 777.');

  // Upload the file to your specified path.
  if(move_uploaded_file($_FILES['userfile']['tmp_name'],$upload_path . $filename))
     echo 'Success';
  else
     echo 'There was an error during the file upload.  Please try again.'; 
?>

2 个答案:

答案 0 :(得分:0)

如果您希望动态链接到用户上传的内容,您可能希望将有关上传文件的元数据存储到数据库中,并使用类似主键的内容来唯一标识每次上传。这样,当用户提供链接以便稍后下载该文件时,可以在主键上完成查找。

例如,一个简单的方法是使用以下模式在数据库中创建upload表...

CREATE TABLE upload (
    id int(11) unsigned NOT NULL AUTO_INCREMENT,
    filename varchar(500) DEFAULT NULL,
    path varchar(500) NOT NULL,
)

现在上传时,您可以在PHP代码中执行以下操作,将记录插入数据库...

const MY_UPLOAD_PATH = '/path/to/uploaded/files';
$stmt = $db->prepare('INSERT INTO upload VALUES(null, ?, ?)');
$stmt->execute(array($_FILES['userfile']['name'], MY_UPLOAD_PATH));
$fileId = $db->lastInsertId();

$fileLink = "/download.php?id=$fileId";

echo "<a href='$fileLink'>Download your file!</a>";

然后你可以编写一个download.php脚本,根据uploadid表上查找,你可以找到文件!

如果您想为临时生成临时生成的链接(过了一段时间后过期,例如),您可以使用uniqid之类的唯一标记在数据库中创建另一个表格类似,并将其与upload表中的主ID键相关联。只需确保添加时间戳,以便知道它是否已过期。然后,您可以在另一个表中的download.php中查找并使用JOIN语句。

示例...

SELECT filename, path FROM upload JOIN tmp ON tmp.fileId = upload.id WHERE (NOW() - tmp.ts) <= 3600 -- expires after 1 hour from insertion

答案 1 :(得分:0)

首先你需要DB结构来处理链接,然后你需要生成一个随机ID,你可以使用像 substr(md5(rand()),0,8); 这将生成一个随机字符串,您可以根据存储在数据库中的路径来识别文件的存储位置。

编辑: 通过处理链接,我的意思是,例如,您将ID存储为名为fileid的列,并将路径存储在另一列中,例如/path/to/upload.php。 检索到ID后,获取与该ID对应的路径并将其放置:<a href="<?php echo $filepath; ?>">

然后你可以随意得到它。使用$ _GET查询检索ID: http://yourfilehost.com/get.php?fileid=fileid goes here

EDIT2: 在选择随机字符串并将其放入数据库之前,请确保它是唯一的,如成员所述,随机!=唯一。

EDIT3:

<?php


// Simple example, no security whatsoever.

// retrive GET filepath

$fileid = $_GET['fileid'];

// do some queries to check if it is unique

if ($unique) {
    // retrieve path from database
    $filepath = /* retrieve path from database corresponding to ID */;
    $filename = /*retrieve filename from database corresponding to ID */;
    echo "<a href=\"$filepath\">$filename</a>";
}