Yii2:避免文件路徑暴漏,代理訪問文件

来源:http://www.cnblogs.com/jianqingwang/archive/2016/11/24/6099996.html
-Advertisement-
Play Games

製作背景:公司要做第三方文件管理系統,客戶有時候需要直接訪問文件,但是我們又不想暴露文件路徑,才有這代理訪問 基本功能介紹:讀取txt文檔、讀取圖片,如果有需要,可以通過插件讀取doc、pdf文檔, 控制器 模型代碼 效果展示: 讀取bmp尾碼的圖片 讀取txt文檔 ...


製作背景:公司要做第三方文件管理系統,客戶有時候需要直接訪問文件,但是我們又不想暴露文件路徑,才有這代理訪問

 

基本功能介紹:讀取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文檔

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 常用的一些開源組件整理: 導出Excel報表的插件:NOPI.dll(基於微軟OpenXml實現)開源的作業調度和自動任務框架:Quartz.NET用於大數據搜索引擎的全文檢索框架:Lucene.net微軟針對企業級應用開發的最佳實踐組件:Enterprise Library 5.0國外一個牛人寫的 ...
  • MVVM是一個比較熱門的開發框架,儘管已經出現很久了,仍然比較受歡迎。MVVM框架包括: M:Model;Model指的是數據模型,例如你要在頁面展示聯繫人信息,那麼Model就是聯繫人的模型,包括聯繫人的名字,電話號碼,頭像等。。。 V:View;View指的是展示的頁面,比如你所現在看到的這篇文 ...
  • 在項目開發過程中,有時會需要用到調用第三方程式實現本系統的某一些功能,例如本文中需要使用到的swftools插件,那麼如何在程式中使用這個插件,並且該插件是如何將PDF文件轉化為SWF文件的呢?接下來就會做一個簡單的介紹。 在.NET平臺中,對C#提供了一個操作對本地和遠程的訪問進程,使能夠啟動和停 ...
  • 本次活動,只是一個嘗試,也許效果好,也許效果差,但不嘗試一下,又怎麼知道呢~~~~最後謝謝大伙的支持! ...
  • 1、類圖 2、創建項目 ………………………… 3、 VisualComponent:抽象界面構件類,充當抽象構件類 為了突出與模式相關的核心代碼,咋基本實例中對空間代碼進行了簡化。 namespace DecoratorSample { /// <summary> /// 抽象構件類 /// </s ...
  • Hibernate中的三種狀態 瞬時狀態:剛創建的對象還沒有被Session持久化、緩存中不存在這個對象的數據並且資料庫中沒有這個對象對應的數據為瞬時狀態這個時候是沒有OID。 持久狀態:對象經過Session持久化操作,緩存中存在這個對象的數據為持久狀態並且資料庫中存在這個對象對應的數據為持久狀態 ...
  • 運行結果: ...
  • 指針: 用來存放變數地址的變數,就成為"指針變數". 定義: 一般形式:類名標識符 指針變數名; " "是說明符,用來說明這個變數是個指針變數,是不能省略的,但不屬於變數名的一部分 前面的類型標誌符表示指針變數所只想的變數的類型,而且只能指向這種類型的變數 示例1:值交換 示例2:函數多個返回值 示 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...