PHP使用Azure Storage Blob上傳文件

不言
發布: 2023-04-02 14:14:01
原創
2176 人瀏覽過

這篇文章主要介紹了關於PHP使用Azure Storage Blob上傳文件,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

前言

分配到一個項目,一個需要內容管理的小站,前端頁面展示與特效由前端同事完成。我負責建置內容管理後台以及提供資料介面。這個專案裡需要管理端能夠上傳視頻,但是甲方提供的伺服器頻寬非常迷你,而且同一個伺服器上還有其他專案並行。
為了防止突發升級帶來的後續影響,組長建議我學習使用Azure Storage Blob,並隨時做好升級準備。

PHP版本限制

在Github裡找到了官方提供的sdk。

Minimum Requirements

PHP 5.6 or above

由於本地配置的PHP環境是5.5.12,而sdk需要的最低php版本為5.6,composer阻止了更新
於是使用composer update --ignore-platform-reqs繞過需求監控強升。
然而類別BlobResources.php中將const設為數組,在5.5中會報錯

Fatal error: Arrays are not allowed in class constants in E:\webroot\tp5cms\vendor\microsoft\azure-storage-blob\src\Blob\Internal\BlobResources.php on line 103
登入後複製

沒辦法只能升級PHP。 

升級WAMP 2.5-3.1

為了開發需要,決定將wampserver提升至最新版本。
升級wamp有個技巧:不能直接覆蓋安裝,要先去掉舊版再安裝新版本。
仔細閱讀升級提示。
總結一下需要做的大概是如下兩件事:

  • 移除服務

    Start WampServer
    【重要】登入MySQL備份所有資料庫資料
    wampmanager -> Stop all Services
    wampmanager -> MySQL -> Service -> Remove service 移除MySQL服務
    wampmanager -> Apache -> Service -> Remove service 移除Apache服務
    stop wampmanager
    右鍵wampmanager -> Exit

  • ## 重新命名資料夾

    #將wamp命名為其他名字以作備份

安裝儲存模擬器

由於公司內沒有用於測試的azure帳號,幸好azure有用於測試開發的儲存模擬器。 Windows系統可以直接下載安裝,Linux系統可以使用開源儲存模擬器Azurite。

  1. 下載模擬器,這裡有下載連結。

  2. 安裝完成後執行

    StartStorageEmulator.cmd#發現提示需要安裝SQL Server Express Local DB,這裡有下載連結。選擇Express Edition,進入後選擇LocalDB下載並安裝。

  3. 再次執行cmd發現錯誤

  4. C:\Program Files (x86)\Microsoft SDKs\Azure\Storage Emulator>AzureStorageEmulato
    r.exe start
    Windows Azure Storage Emulator 5.3.0.0 command line tool
     
    未经处理的异常: System.TimeoutException: Unable to open wait handle.
    在 Microsoft.WindowsAzure.Storage.Emulator.Controller.EmulatorProcessControll
    er.InternalWaitForStorageEmulator(Int32 timeoutInMilliseconds)
    在 Microsoft.WindowsAzure.Storage.Emulator.Controller.EmulatorProcessControll
    er.EnsureRunning(Int32 timeoutInMilliseconds)
    在 Microsoft.WindowsAzure.Storage.Emulator.Commands.StartCommand.RunCommand()
     
    在 Microsoft.WindowsAzure.Storage.Emulator.Program.Main(String[] args)
    登入後複製
經過查詢後發現這是因為有進程佔用了10000號連接埠。

#运行:>C:\Users\Walter>netstat -p tcp -ano | findstr :10000> TCP 127.0.0.1:10000 0.0.0.0:0 LISTENING 2664
 #根据PID 2664查询对应的进程>C:\Users\Walter>tasklist | findstr "2664">YunDetectService.exe 2664 Console 1 9,944 K
 
#只是一个不重要的进程,去掉后继续开发>C:\Users\Walter>taskkill /pid 2664 /f>成功: 已终止 PID 为 2664 的进程。
 
#以下是模拟器成功运行的范例>C:\Program Files (x86)\Microsoft SDKs\Azure\Storage Emulator>AzureStorageEmulator.exe start
Windows Azure Storage Emulator 5.3.0.0 command line tool
The storage emulator was successfully started. 
>C:\Program Files (x86)\Microsoft SDKs\Azure\Storage Emulator>AzureStorageEmulator.exe status
Windows Azure Storage Emulator 5.3.0.0 command line tool
IsRunning: True
BlobEndpoint: http://127.0.0.1:10000/QueueEndpoint: http://127.0.0.1:10001/TableEndpoint: http://127.0.0.1:10002/
登入後複製

開始開發 

透過官方的例子可以嘗試新增container,blob及刪除功能。

成功上傳blob後,卻無法對儲存模擬器中的資源進行尋址。
eg.使用的帳號名稱
devstoreaccount1,建立的容器名稱mycontainerudfpbk,blob名稱5ac1a5c82021d.png根據文件中的規則,資源位址應為

http://127.0.0.1:10000/devstoreaccount1/mycontainerudfpbk/5ac1a5c82021d.png但是傳回資料一直是

<Error>
  <Code>ResourceNotFound</Code>
  <Message>    The specified resource does not exist. RequestId:9d2d1b08-12b1-4feb-8636-4325eb71b838 Time:2018-04-08T09:14:14.3007800Z
  </Message>
</Error>
登入後複製

根據閱讀相關文章後發現原來在建立容器時,若沒有設定過存取權限(container-level access policies),則預設為禁止外部存取。 

ACL(PublicAccessType)權限分為三等

CONTAINER_AND_BLOBSBLOBS_ONLYNONENONE
若資源需要外部能夠存取則設定為BLOBS_ONLY即可。
附上自己封裝的azure輔助類別

這中間還遇到一個小問題,在設權限時,ACLBase報了個錯誤
Static function MicrosoftAzure\Storage\Common\ Internal\ACLBase::createAccessPolicy() should not be abstract
經過查詢後發現,在PHP5.2以後不允許abstract和static同時使用在方法上。

#只要将ACLBase中的abstract protected static function createAccessPolicy();abstract protected static function validateResourceType($resourceType);#改为protected static function createAccessPolicy(){}protected static function validateResourceType($resourceType){}#即可
登入後複製

 總結 

中止進程的三個方法

  1. 利用pid結束進程
    taskkill / pid PID /f

  2. 利用pid結束進程
    ntsd -c q -p PID

  3. 利用進程名稱結束進程
    ntsd -c q -pn NAME.exe

#位址

  1. 官方提供的sdk位址

  2. 自用輔助類別位址

註:強制結束前先明確這個進程的作用

以上就是本文的全部內容,希望對大家的學習有幫助,更多相關內容請關注PHP中文網!

相關推薦:

PHP後台圖片上傳作品的介紹

使用ajax在js和php之間傳送值的介紹

以上是PHP使用Azure Storage Blob上傳文件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!