[英]PHP - Google App Engine Uploading large files to Google Drive as chunks (Resumable Upload) - 500 Error
我正在使用在后台運行的 php 代碼將文件從 Google Cloud 存儲桶上傳到 Google Drive 文件夾。 我的問題是當文件大小增加時,Google Drive(或 GAE)會給出 500 錯誤。
Error: Server Error
The server encountered an error and could not complete your request.
Please try again in 30 seconds.
我正在使用以下依賴項。
"nao-pon/flysystem-google-drive": "^1.1",
以下是我的代碼部分,導致此錯誤。 這適用於小文件:
$fileN = $this->clean($att->ATT_TITLE);
$fileData = file_get_contents("https://storage.googleapis.com/xxxxxx/".$att->ATT_FILE);
$dir = sys_get_temp_dir();
$tmp = tempnam($dir, $fileN);
file_put_contents($tmp, $fileData);
Storage::cloud()->putFileAs( $folderPath, new File($tmp),$fileN);
我已經在 .env 文件中設置了配置
FILESYSTEM_CLOUD=google
GOOGLE_DRIVE_CLIENT_ID=xxxxapps.googleusercontent.com
GOOGLE_DRIVE_CLIENT_SECRET=xxxxx
GOOGLE_DRIVE_REFRESH_TOKEN=xxxxxx
GOOGLE_DRIVE_FOLDER_ID=xxxx
#GOOGLE_DRIVE_TEAM_DRIVE_ID=xxx
我已經在 filesystem.php 中設置了如下磁盤
'google' => [
'driver' => 'google',
'clientId' => env('GOOGLE_DRIVE_CLIENT_ID'),
'clientSecret' => env('GOOGLE_DRIVE_CLIENT_SECRET'),
'refreshToken' => env('GOOGLE_DRIVE_REFRESH_TOKEN'),
'folderId' => env('GOOGLE_DRIVE_FOLDER_ID'),
// 'teamDriveId' => env('GOOGLE_DRIVE_TEAM_DRIVE_ID'),
],
我已將 php.ini 文件設置如下
upload_max_filesize = 300M
post_max_size = 300M
memory_limit = 3000M
應用程序.yaml
runtime: php72
handlers:
- url: /assets
static_dir: public/assets
env_variables:
APP_KEY: xxxxx
APP_STORAGE: /tmp
CACHE_DRIVER: file
VIEW_COMPILED_PATH: /tmp
SESSION_DRIVER: database
DB_DATABASE: xxx
DB_USERNAME: xx
DB_PASSWORD: xxxx
DB_SOCKET: "/cloudsql/xxxxx"
runtime_config:
document_root: public
誰能給我一個提示或給我另一種方法來做到這一點? 我的要求基本上是通過 Google App Engine 中的后台作業將大文件(如 250MB)上傳到 Google Drive。
由於您正在調用 Cloud Storage API 來上傳可以在 60 秒內完成上傳的大文件,這是 Google Cloud Storage API 的默認超時時間。 您可以自行修改 API 超時。 這里是stackoverflow的案例供大家參考,自己設置API超時。
對於這種情況,分塊上傳解決了這個問題。
請參閱以下 Google API PHP 客戶端示例https://github.com/googleapis/google-api-php-client/blob/master/examples/large-file-upload.php
示例工作代碼:
$fileData = file_get_contents("https://storage.googleapis.com/xxxx/".$att->ATT_FILE);
$dir = sys_get_temp_dir();
$tmp = tempnam($dir, $fileN);
file_put_contents($tmp, $fileData);
$fileToUpload = new File($tmp);
$filename = $fileN;
$mimeType = mime_content_type($tmp);
$driveService = Storage::cloud();
$client = new \Google_Client();
$client->setClientId('xxxx');
$client->setClientSecret('xxx');
$client->refreshToken('xxx');
$client->setApplicationName('xxx');
$service = new \Google_Service_Drive($client);
// Test 1
$file = new \Google_Service_Drive_DriveFile();
$file->title = $fileN;
$file->name = $fileN;
$file->parents = array($basePath);
$chunkSizeBytes = 1 * 1024 * 1024;
// Call the API with the media upload, defer so it doesn't immediately return.
$client->setDefer(true);
$request = $service->files->create($file);
// Create a media file upload to represent our upload process.
$media = new \Google_Http_MediaFileUpload(
$client,
$request,
$mimeType,
null,
true,
$chunkSizeBytes
);
$media->setFileSize(filesize($tmp));
// Upload the various chunks. $status will be false until the process is
// complete.
$status = false;
$handle = fopen($tmp, "rb");
while (!$status && !feof($handle)) {
$chunk = fread($handle, $chunkSizeBytes);
$status = $media->nextChunk($chunk);
}
// The final value of $status will be the data from the API for the object
// that has been uploaded.
$result = false;
if($status != false) {
$result = $status;
}
fclose($handle);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.