Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在url中传递长文件名并使用php函数下载文件?_Javascript_Php_Html - Fatal编程技术网

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

Javascript 如何在url中传递长文件名并使用php函数下载文件?,javascript,php,html,Javascript,Php,Html,我有一个下面的函数,用于下载文件,该文件的名称作为url中的参数传递。代码如下: public function actionDownloadFile($filename) { $file = Yii::app()->request->getBaseUrl(true) . '/upload/digitaluploads/' . $filename; header('Content-Type: application/octet-str

我有一个下面的函数,用于下载文件,该文件的名称作为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
的文件,但不适用于其中有空格的文件。i、 e对于名称中包含空格的文件,如
'maid with the flashen hair.mp3'
,它将失败

如您所见,我甚至使用urlencode对url中的参数进行了编码。我也尝试过使用decode,但我得到的只是那张破页

有人吗?

试试这个:

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

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

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; 
} 
函数fullescape($in)
{ 
$out='';

对于($i=0;$iuse
urlencode()
对于spacescheck,请检查您的文件在控制器中的位置是否正确,如果有效,请在浏览器中手动尝试该url。从url检索后,如果您回显
$filename
,您会得到什么?@OnlyMAJ,正如我已经说过的,这适用于不带空格的文件名。但是,它不适用于带空格的文件名,因此是su我们认为这不是道路issue@Hammad如果它不能在浏览器中使用空格,则文件不存在。是的,但当您想将文件上载到web服务器上时,最好重命名文件,以避免此类问题。是的,可能是。但我的客户端希望保留文件名。我唯一能做的是在文件名之前添加一些数字,以保持这些唯一性。不管怎样,谢谢你的回答。我有upvoted@Hammad您也可以将文件名保存在db中,但当您想要上载文件时,以及当用户想要下载文件时,您需要将存储的文件名传递到标头中以实现此目标。这样您只需转义空格,您应该使用urlencode转义所有特殊字符s