如何在 url 中传递长文件名并使用 php 函数下载文件

How to pass long filename in url and download the file using php function?

本文关键字:php 函数 文件 下载 文件名 url      更新时间:2023-09-26

我有一个以下函数,可以下载文件名作为 url 中的参数传递的文件。这是代码:

    public function actionDownloadFile($filename)
    {
        $file = Yii::app()->request->getBaseUrl(true) . '/upload/digitaluploads/' . $filename; 
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="' . basename($file) . '"');
        readfile($file);
    }

当用户从视图中单击下载按钮时,将从视图文件调用此函数:

<a class="digital-download" href="<?php echo Yii::app()->request->getBaseUrl('true'); ?>/site/downloadfile/filename/<?php echo urlencode($digital_download['filename']); ?>">Click here to download</a>

这适用于没有空格的文件名,就像它适用于名称为 somefile.mp3 的文件,但它不适用于其中有空格的文件。 即对于名称包含空格的文件失败,例如 'maid with the flaxen hair.mp3'.

如您所见,我什至使用 urlencode 对 url 中的参数进行了编码。我也尝试在行动中使用解码,但我得到的只是损坏的页面。

任何人?

使用此函数来避免空间和其他可能的问题:

function fullescape($in) 
{ 
  $out = ''; 
  for ($i=0;$i<strlen($in);$i++) 
  { 
    $hex = dechex(ord($in[$i])); 
    if ($hex=='') 
       $out = $out.urlencode($in[$i]); 
    else 
       $out = $out .'%'.((strlen($hex)==1) ? ('0'.strtoupper($hex)):(strtoupper($hex))); 
  } 
  $out = str_replace('+','%20',$out); 
  $out = str_replace('_','%5F',$out); 
  $out = str_replace('.','%2E',$out); 
  $out = str_replace('-','%2D',$out); 
  return $out; 
} 

在这里找到: http://php.net/manual/en/function.urlencode.php

试试这个:

str_replace(' ', '%20', 'your url here');