【问题标题】:How to download file with its original name instead of unique name?如何使用原始名称而不是唯一名称下载文件?
【发布时间】:2014-06-27 17:18:31
【问题描述】:

目前我的文件上传进度如下:

  1. 用户选择要上传的文件。
  2. 然后我使用以下 PHP 代码将用户上传的文件重命名为唯一名称:

    $ext = explode('.', basename( $_FILES['file1']['name']));
    $file_name1 = md5(uniqid()) . "." . $ext[count($ext)-1]; 
    
  3. 之后,我只需将这个独特的文件上传到我的“upload_doc/”目录。

现在我的脚本中有一个选项可以下载这个上传的文件。要下载,我只是从“updload_doc/”目录中调用这个unique 文件名并下载它。

现在它会在我下载文件时显示我重新生成的文件名。

有没有办法用它的原始名称而不是unique文件名下载这个文件?

注意:我可以将原始文件上传到目录,但如果用户上传相同的文件会发生什么?各位大佬能说说有什么诀窍吗?

我的文件下载系统:

这是一个下载按钮:

<a target="_self" href="download.php?filename=<?php echo $rselectfile1['file_name']; ?>"><input type="button" name="download" value="Download" class="submit"/></a>

这是download.php文件

<?php
@session_start();
//require_once("config.php");
if(!isset($_SESSION['front_username']) && isset($_SESSION['front_username']) == "" &&
    !isset($_SESSION['front_password']) && isset($_SESSION['front_password']) == "" &&
     !isset($_SESSION['user_id']) && isset($_SESSION['user_id']) == "") {
    header("Location:login.php");   
    exit();
}


$file_get = $_GET['filename'];

$tmp = explode(".",$file_get);
switch ($tmp[count($tmp)-1]) {
  case "pdf": $ctype="application/pdf"; break;
  case "exe": $ctype="application/octet-stream"; break;
  case "zip": $ctype="application/zip"; break;
  case "docx":
  case "doc": $ctype="application/msword"; break;
  case "csv":
  case "xls":
  case "xlsx": $ctype="application/vnd.ms-excel"; break;
  case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
  case "gif": $ctype="image/gif"; break;
  case "png": $ctype="image/png"; break;
  case "jpeg":
  case "jpg": $ctype="image/jpg"; break;
  case "tif":
  case "tiff": $ctype="image/tiff"; break;
  case "psd": $ctype="image/psd"; break;
  case "bmp": $ctype="image/bmp"; break;
  case "ico": $ctype="image/vnd.microsoft.icon"; break;
  default: $ctype="application/force-download";
}

header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=\"".$file_get."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".$fsize);
ob_clean();
flush();
readfile("upload_doc/$file_get" );


?>

【问题讨论】:

  • 当然,在重命名之前为名称设置一个变量。
  • @Fred-ii- 我不明白。
  • $filename = $_FILES["uploaded_file"]["name"]; 根据developphp.com/page.php?id=449
  • @Fred-ii- 说了什么,但你必须在某个地方跟踪它。或者,您可以将原始名称作为唯一名称的一部分,但使用分隔符,以便于重新解析。
  • @TecBrat 不,我不想将其与原始唯一 ID 混为一谈。

标签: php filenames


【解决方案1】:

我只会在文件名前加上哈希而不是替换它。这样原始文件名被保留。所以你的代码看起来像:

$file_name1 = md5(uniqid()) . '-' . $_FILES['file1']['name'];
// Example: b4b34d95b44ea3ebaa125508fd51dd44-image.jpg

下载时,您可以从文件名中删除此哈希:

$file_name1 = substr($file_name1, 33);
// Example: image.jpg

然后将文件名设置为:

header('Content-Disposition: attachment; filename="' . $file_name1 . '"');

【讨论】:

  • 哦,你快了 13 秒 :)
  • @Gergo Erdosi 这可能是个骗局,但现在确定它是否有效。我正在尝试。
  • 我认为保留原始文件名不是一个好主意。重命名上传文件的主要原因之一是确保文件名不包含“坏”字符。我强烈建议使用数据库来存储原始文件名。
  • 那么如果有两次名为'`image.jpg'的文件有问题吗?
  • 什么?你是什​​么意思?
【解决方案2】:

这很容易。只需在文件上传时将原始文件名和唯一文件名保存到数据库,然后在下载脚本中使用唯一文件名从数据库中选择行并将其名称设置为原始名称。

原始文件名存储在上传脚本中的变量中:

$_FILES['file_input_tag_name']['name']

要设置下载文件的自定义文件名,只需设置正确的标题字段:

header('Content-Disposition: attachment; filename="' . $original_filename . '"');

【讨论】:

  • 检查我更新的问题。我上传了我的脚本。您说下载时获取原始文件名。但是我的文件保存到具有唯一名称的目录中,那么我怎样才能获得原始文件名?
  • 您在$_FILES['file1']['name']) 中有原始文件名,您已经在使用它(您提取文件扩展名)。
  • 另外@Fred-ii- 两天前在您的问题评论中提到了这一点。
猜你喜欢
  • 2014-08-17
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
  • 2021-07-13
  • 2010-12-10
  • 1970-01-01
相关资源
最近更新 更多