Firebase 存储上传 php

Firebase Storage upload php

我目前正在尝试使用 php 上传到 Firebase 云存储,但是 运行 遇到了问题。

我在 html 中有一个表单,它获取上传的文件(在我的例子中是图像),并将其传递到 php 文件。

这张图片很小,12.8kB,是一张 JPEG 图片。

php 文件获取图像,并尝试将其上传到存储。 我目前的php代码大致是:

$storage = new StorageClient(['projectId' => '<my_project_id> ']);
$bucket = $storage->bucket('images');
$bucket->upload($_FILES['imageToUpload']['tmp_name']);

我可以让它打印存储桶名称及其详细信息,所以我知道不是那部分导致了错误。

我得到的错误是,

Fatal error: Uncaught InvalidArgumentException: A name is required when data is of type string or null. 
in /var/www/html/Images/vendor/google/cloud-storage/src/Bucket.php:258 
Stack trace: #0 /var/www/html/Images/uploadImage.php(74): Google\Cloud\Storage\Bucket->upload('/tmp/phpA9SAM8') 
#1 {main} thrown in /var/www/html/Images/vendor/google/cloud-storage/src/Bucket.php on line 258

哦,如果重要的话,我也在使用 16.04 Ubuntu,使用 apache2。 (但我已经能够使用 php 上传到我自己的计算机。现在只需重构以使用 Firebase)

编辑: 当我将代码更改为

$bucket->upload(
    file_get_contents($_FILES['imageToUpload']['tmp_name']),
    [
        'name' => $_FILES['imageToUpload']['name']
    ]
);

我遇到错误:

Fatal error: Uncaught Google\Cloud\Core\Exception\NotFoundException: { "error": { "errors": [ { "domain": "global", "reason": "notFound", "message": "Not Found" } ], "code": 404, "message": "Not Found" } } in /var/www/html/Images/vendor/google/cloud-core/src/RequestWrapper.php:263
 Stack trace: #0 /var/www/html/Images/vendor/google/cloud-core/src/RequestWrapper.php(168): Google\Cloud\Core\RequestWrapper->convertToGoogleException(Object(GuzzleHttp\Exception\ClientException)) 
#1 /var/www/html/Images/vendor/google/cloud-core/src/Upload/MultipartUploader.php(64): Google\Cloud\Core\RequestWrapper->send(Object(GuzzleHttp\Psr7\Request), Array) 
#2 /var/www/html/Images/vendor/google/cloud-storage/src/Bucket.php(268): Google\Cloud\Core\Upload\MultipartUploader->upload() 
#3 /var/www/html/Images/uploadImage.php(75): Google\Cloud\Storage\Bucket->upload('/tmp/phpR2vYYg', Array) 
#4 {main} thrown in /var/www/html/Images/vendor/google/cloud-core/src/RequestWrapper.php on line 263

通过使用$_FILES['imageToUpload']['tmp_name'],您使用的是上传图片的临时名称作为内容,而不是实际的图片文件。

解决这个问题的最快方法是使用:

$bucket->upload(
    file_get_contents($_FILES['imageToUpload']['tmp_name']),
    [
        'name' => $_FILES['imageToUpload']['name']
    ]
);

upload 方法接受一组选项(包括目标文件名),如方法的 PHPDoc 中所述:https://github.com/GoogleCloudPlatform/google-cloud-php/blob/master/Storage/src/Bucket.php#L216

请记住,直接使用上传的文件名(而不是 tmp_name)存在安全隐患,因此请确保在将上传的文件移动到您的云存储之前对其进行验证和清理.

http://php.net/manual/en/features.file-upload.post-method.php http://php.net/manual/en/function.move-uploaded-file.php