Yii2:避免文件路径暴漏,代理访问文件

制作背景:公司要做第三方文件管理系统,客户有时候需要直接访问文件,但是我们又不想暴露文件路径,才有这代理访问

基本功能介绍:读取txt文档、读取图片,如果有需要,可以通过插件读取doc、pdf文档,

http://www.yii2.com/uploads/temp/read.bmp是我的真实路径

控制器

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2016/11/24 0024
 * Time: 14:38
 */

namespace app\controllers;

use yii\web\Controller;
use app\models\FetchFiles;

class FetchFilesController extends Controller
{
    public $file_path = ‘http://www.yii2.com/uploads/temp/read.bmp‘;
    public function actionReadFile(){
        $file_path = $this->file_path;
       // echo  $file_path;
        //die;
        $FetchFiles = new FetchFiles();
      $FetchFiles->actionReadFile($file_path);

    }

}

模型代码

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2016/11/24 0024
 * Time: 16:53
 */

namespace app\models;

use yii\base\Model;

class FetchFiles extends Model
{

    /**
     *转换路径为虚拟路径,返回给客户
     */
    public  function actionVirtualFile(){
        //virtualfile需要改为控制器名字,每次访问转换调用控制器去访问
        $file_path = $this->file_path;
        $file_path = str_replace(‘uploads/temp‘,‘virtualfile‘,$file_path);
        echo($file_path);
    }

//客户访问资源时候,转换真实路径
    public function  actionReadFile($file_path){

        //获取真实资源路径
        $file_path = str_replace(‘virtualfile‘,‘uploads/temp‘,$file_path);
      //  Header("Location: $file_path");
        //die();
        //判断文件;类型
        $fileType =  substr(strrchr($file_path, ‘.‘), 1);
        //统一转换为小写
        $fileType = strtolower($fileType);
        //选择文件类型,根据文件类型调用不同方法读取文件
        switch($fileType){
            case ‘png‘:
                $this->actionReadImg($file_path,$fileType);
                break;
            case ‘jpg‘:
                $this->actionReadImg($file_path,$fileType);
                break;
            case ‘jpeg‘:
                $this->actionReadImg($file_path,$fileType);
                break;
                break;
            case ‘bmp‘:
                $this->actionReadImg($file_path,$fileType);
                break;

            case ‘txt‘:
                $this->actionReadTxt($file_path);
                break;

            default:
                echo  $fileType. "文件类型不支持查看,请直接下载!";
        }
        // echo $fileType;
        // echo file_get_contents("$file_path");

    }

    //读取txt文档的方法
    public function actionReadTxt($file_path){
        //echo ‘使用访问文件的方法‘.$file_path;
      //  $content = file_get_contents($file_path);
        $handle = fopen("$file_path", ‘r‘);
        $content = ‘‘;
        while(false != ($a = fread($handle, 8080))){//返回false表示已经读取到文件末尾
            $content .= $a;
        }
        fclose($handle);
        //转码,确保文档是utf-8;
        $content =  iconv(‘GB2312‘, ‘UTF-8‘, $content);
       echo $content;
    }

    //读取图片的方法
    public function actionReadImg($file_path,$fileType){

        $contents=file_get_contents($file_path);
        //设置图片的头文件
        $header = ‘Content-Type: image/‘.$fileType;
        header( "$header" );//访问图片
        base64_decode($contents);
        echo $contents;
    }

}

效果展示:

读取bmp后缀的图片

读取txt文档

时间: 2025-01-02 12:14:46

Yii2:避免文件路径暴漏,代理访问文件的相关文章

java获取src下文件路径和获取webRoot下文件路径

获取src下的fileurl.properties文件路径 this.getClass().getResource("/fileurl.properties").getPath() 获取webRoot下的service文件夹路径 request.getSession().getServletContext().getRealPath("/service");

CS1:Server 2003 文件路径过长导致最末文件夹权限无法继承上层文件夹权限

客户问题概括: 在Win 2003 服务器上客户访问本地一些目录的文件提示拒绝访问. 客户已发现尝试对相关文件owner更改为当前登录用户或者本地管理员用户组成员,然后添加本地管理员组为此文件无安全控制权限即可访问此文件. 客户要求需要用一种命令行方式对有问题的目录下所有文件或目录进行上述问题的更改,以达到可以正常访问文件目的. 解决方法:使用subinacl 命令行工具来进行相应操作即可. 1.下载subinacl工具.2.使用subinacl进行相应权限的更改. 举例:C:\errFolde

wampserver设置网站文件路径,虚拟域名访问

文件:httpd.conf @开启虚拟hosts # Virtual hostsInclude conf/extra/httpd-vhosts.conf 文件:httpd-vhosts.conf @配置虚拟主机 <VirtualHost *:80> DocumentRoot "E:/www/pz" ServerName to.pz.com <Directory "E:/www/"> Options Indexes FollowSymLinks

linux 如何获取当前文件路径(source如何获取当前文件路径 bash如何获取当前文件路径)

bash  如何获取当前文件的绝对路径 #!/bin/bash export  bashpath=$(cd `dirname $0`;pwd) echo $bashpath source 文件获取当前文件的绝对路径 #!/bin/bash # 下面是输出当前文件的绝对路径 cd $(dirname $BASH_SOURCE) # echo $(pwd)/$(basename $BASH_SOURCE) temp_file=`echo $(pwd)/$(basename $BASH_SOURCE)

PHP文件路径及操作权限(上)

我们先来了解一下文件处理系统的作用吧(o?▽?)o   1.所有的项目都离不开文件处理 2.可以用文件长时间保存数据 3.建立缓存,服务器中文件操作 一.文件类型 以Linux为模型的,在Windows下只能获取file.dir.unknown这三种类型 在Linux/Unix下,可以获取block.char.dir.fifo.file.link.unknown类型 判断目录的一些函数?(?????)? is_dir -- 判断该文件是否是一个目录 is_executable -- 判断该文件是

关于文件路径方面的小麻烦

写程序的时候经常引用外部资源,这个时候通过文件路径定位就相当重要了. 问题提出 在Eclipse工程中写一段代码,想要调用工程中的某一个资源文件. File file=new File("/EclipseProj/res.txt"); .... //读取文件 一运行,总是说res.txt找不到.只要将路径改成"EclipseProj/tes.txt"即可.不知为什么? 症结所在 没有搞清楚相对路径中' / '的作用,"/Director/File"

使用Profile文件记录JFileChooser(或者File控件)最新打开的文件路径

一.描述 我们使用JFileChooser或者File控件打开Windows系统目录下的文件之后,如何保存我们最近打开的文件路径,使得每次打开文件就能打开最近一次打开的文件目录,而不是每次默认打开C:\Users\Administrator\Documents目录.我们需要使用Profile属性文件来记录最近打开的文件路径,在File控件打开文件前先读取配置文件中的最近文件目录,在打开文件后将路径保存到Profile文件中,在操作完毕点击确定按钮后写入Profile配置文件. 二.源代码 imp

Java I/O---RandomAccessFile类(随机访问文件的读取和写入)

1.JDK API中RandomAccessFile类的描述 此类的实例支持对随机访问文件的读取和写入.随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组.存在指向该隐含数组的光标或索引,称为文件指针:输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针.如果随机访问文件以读取/写入模式创建,则输出操作也可用:输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针.写入隐含数组的当前末尾之后的输出操作导致该数组扩展.该文件指针(实现数组随机读写)可以通过

Mac 拷贝文件路径

Mac中拷贝文件路径 方式1:把文件拖到终端里 然后就会显示该文件的路径 ( 不推荐 ) 方式2:在右键菜单中的服务内添加快捷操作 1.打开系统自带应用自动操作(Automator),软件图标如下??: 2.点击新建文稿(New Document),如下图??: 3.选择快速操作(Quick Action),然后点击选取(Choose),如下图??: 4.在左侧搜索框中输入拷贝(copy),然后选择拷贝至剪贴板(Copy to Clipbord),之后将其拖到右侧. 在右侧上方,将工作流程收到当