2017-03-26 4 views
1

Ich versuche, einige Dateien mit PHP in Google Cloud Storage hochzuladen. Es scheint teilweise zu funktionieren, da ich die Dateien in der Webkonsole sehe, aber ich habe festgestellt, dass alle Dateien nur 14 Bytes groß sind, während das Original viel größer ist.Nur 14 Bytes werden in Google Cloud Storage hochgeladen.

Dies ist der Code Ich verwende:

/** 
* 
*/ 
public static function saveFile($originalFile, $newFilename) { 

    $bucket = MyStorage::getBucket(); 

    if ($bucket == null) { 

     // Save locally 
     Storage::disk('local')->put(FileController::$FILE_DIR . $newFilename, file_get_contents($originalFile)); 

    } else { 

     // Save to Google Cloud Platform 
     $bucket->upload($originalFile->getRealPath(), ['name' => $newFilename]); 

    } 
} 

/** 
* 
*/ 
private static function getBucket() { 

    $appEnv = getenv('APP_ENV'); 

    if ($appEnv == "production" || $appEnv == "test") { 

     $GOOGLE_CLOUD_PROJECT_ID = getenv('GOOGLE_PROJECT_ID'); 
     $GOOGLE_CLOUD_BUCKET_NAME = getenv('GOOGLE_BUCKET_NAME'); 

     $storage = new StorageClient(['projectId' => $GOOGLE_CLOUD_PROJECT_ID]); 
     $bucket = $storage->bucket($GOOGLE_CLOUD_BUCKET_NAME); 

     return $bucket; 

    } else { 

     return null; 
    } 
} 

$originalFile->getRealPath() kehrt so etwas wie /tmp/asdfasdfadf und ich habe festgestellt, dass die Datei existiert und ist eine vernünftige Größe. Der $newFilename Variablenname ist, was ich möchte, dass es gespeichert wird, und dieser Teil scheint zu funktionieren, da ich diesen Dateinamen in der Webkonsole sehe.

Irgendwelche Ideen, was könnte passieren?

+0

ich nicht wirklich php weiß es, aber ist es möglich, dass Sie nur den Pfad zur Datei als String hochladen, im Gegensatz zur eigentlichen Datei? Wenn Sie sich die Client-Bibliothek ansehen, scheinen sie 'fopen' zu verwenden: https://googlecloudplatform.github.io/google-cloud-php/#/docs/google-cloud/v0.24.0/storage/bucket?method= upload dh '$ bucket-> hochladen (fopen ($ originalFile-> getRealPath(), 'r'), ['name' => $ neuerDateiname]);' –

+0

Sie können den Upload der maximal erlaubten Größe in PHP ändern. ini.serch das upload_max_filesize = 128M – lalithkumar

+0

@Robert Lacok guten Fang, ich werde das überprüfen und melden. – Sandy

Antwort

1

Es scheint, dass Sie nur den Pfad zur Datei als Zeichenfolge hochladen, im Gegensatz zur eigentlichen Datei.

Wenn Sie auf der Client-Bibliothek suchen, they seem to use fopen

$bucket->upload(fopen($originalFile->getRealPath(), 'rb'), ['name' => $newFilename]);

+0

Danke, das hat meinen Fehler behoben. – zundi

0

Ja, um den Dateiupload zu verwenden, müssen Sie den Bytestrom lesen, um ihn an die entfernte Cloud zu senden. fopen erledigt diesen Job für Sie, um einen Bytestrom zu erzeugen.

0
else { 

    // Save to Google Cloud Platform 
    $bucket->upload($originalFile->getRealPath(), ['name' => $newFilename]); 

} 

Sollte sein:

else { 

    // Save to Google Cloud Platform 
    $bucket->upload(fopen($originalFile->getRealPath(), 'rb'), ['name' => $newFilename]); 

    if(fclose($originalFile->getRealPath()) === false){ 
     // Success 
    } else{ 
     // Failure 
    } 


} 

Der Grund, dass Ihr Code ist nicht funktionierte, weil Sie nur den Dateinamen zu Google Cloud wurden hochzuladen. "/ tmp/asdfasd" hat 14 Zeichen.

Here ist eine Antwort darauf, warum das 'b' für den Befehl fopen wichtig ist.

FClose schließt die Ressource und verhindert Datenlecks. Überprüfen Sie auch den Rückgabewert von fclose(), da einige OS nur die Dateiausgabe löschen. Durch die Überprüfung des Rückgabewerts können schwerwiegende Datenverluste verhindert werden.

Verwandte Themen