Sina App Engine (SAE) 為安全考量採用唯讀程式碼環境,無法直接寫入本地檔案系統。SAE 提供 Storage 服務 作為持久化儲存方案,適用於使用者上傳圖片、文件、日誌等資產。本文說明兩種存取方式與完整上傳範例。
saestor://DomainName/目錄/檔案名mkdir(),直接寫入完整路徑即可自動建立中間目錄。SAE 實作了 stream wrapper,可直接使用 fopen、fwrite、move_uploaded_file、file_get_contents 等標準函數操作 saestor:// 路徑。
<!DOCTYPE html>
<html><body>
<form action="" method="post" enctype="multipart/form-data">
<label>選擇檔案: <input type="file" name="file" /></label>
<input type="submit" name="submit" value="上傳" />
</form>
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
$domain = 'test'; // SAE 後台建立的 Domain 名稱
$upload_dir = "saestor://$domain/uploads/";
$file = $_FILES['file'];
if ($file['error'] !== UPLOAD_ERR_OK) {
die("上傳錯誤代碼: {$file['error']}");
}
$dest = $upload_dir . basename($file['name']);
if (move_uploaded_file($file['tmp_name'], $dest)) {
echo "上傳成功: $dest";
} else {
echo "上傳失敗";
}
}
?>
</body></html>
// 需在 SAE 環境自動載入,或 require 'SaeStorage.php'
$storage = new SaeStorage();
$domain = 'mydomain';
// 寫入
$storage->write($domain, 'path/to/file.jpg', $binary_data);
// 讀取
$data = $storage->read($domain, 'path/to/file.jpg');
// 刪除
$storage->delete($domain, 'path/to/file.jpg');
// 列出檔案
$list = $storage->getList($domain, 'path/to/');
https://domain-name.stor.sinaapp.com/path/file.jpg)。sae.storage.max_file_size 設定調整)。mkdir() 權限參數:mkdir($path, 0777) 的模式參數會被忽略。stream_copy_to_stream 避免記憶體耗盡。function get_public_url($domain, $path) {
// 公開 Domain 可直接拼接
return "https://$domain.stor.sinaapp.com/$path";
}
// 私有 Domain 需簽名 URL (參考 SAE 官方簽名演算法)
SAE Storage 以標準檔案系統介面提供分散式儲存,開發體驗極佳。掌握 saestor:// 協定與 Domain 管理,即可輕鬆處理使用者上傳、靜態資產部署、日誌持久化等需求。