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