繁体   English   中英

使用PHP和Ajax将文件上传到Google Cloud Storage Bucket

[英]Upload a file to Google Cloud Storage Bucket with PHP and Ajax

我正在开发一个PHP项目,需要在其中将文件(由HTML表单提供)上传到Google Cloud Storage Bucket。 表单请求将作为ajax请求接收。 我的文件上传成功,但是在存储桶中,它显示了一个临时文件,但是我已经上传了一个图像文件。

这是我尝试过的:

PHP文件:

if(isset($_FILES['file'])){
    $errors= array();
    // Authentication with Google Cloud Platform
    $client = new StorageClient(['keyFilePath' => 'api-project-374381085870-eaf930d9ffd7.json']);
    $bucket = $client->bucket('storage_client');

    // Upload a file to the bucket.
    $bucket->upload(
        fopen($_FILES['file']['name'], 'r')
    );
}

Ajax代码:

    $(document).on('submit', '#fileForm', function (e) {
    e.preventDefault();
    var data = new FormData($('#fileForm').get(0));
    $.ajax({
        type: 'POST',
        url: 'gcp_storage.php',
        data: data,
        processData: false,
        contentType: false,
        success: function ($data) {
            console.log('Succcess');
            $('#success').attr('hidden', false);
        }
    });
});

HTML代码:

<form id="fileForm" action="" method="post" enctype="multipart/form-data">
    <div class="form-row">
        <br/>
        <div class="form-group">
            <label for="textFile">Text File: </label>
            <br/>
            <input type="file" name="file" id="textFile">
        </div>
    </div>
    <br>
    <button type="submit" class="btn btn-lg btn-primary"> Upload </button>
</form>

图像文件在存储桶中的外观如下: 临时文件未使用任何格式进行格式化,而是未格式化的文件。

更新:

现在,我已更改:

这个:

// Upload a file to the bucket.
    $bucket->upload(
        fopen($_FILES['file']['name'], 'r')
    );

至:

// Upload a file to the bucket.
$bucket->upload(
    fopen($_FILES['file']['tmp_name'], 'r')
);

它已成功上传文件,但文件扩展名未显示在存储桶中。 那么,有没有一种方法可以在上传到Google云端存储桶之前重命名文件?

请帮帮我!

提前致谢!

用名称添加$ options参数可以解决此问题。

$bucket->upload(
    fopen($_FILES['file']['tmp_name'], 'r'),
    ['name' => 'some-name.jpg']
);    

可以在源代码中找到更多信息: https : //github.com/GoogleCloudPlatform/google-cloud-php/blob/master/Storage/src/Bucket.php

更多信息:

$ bucket-> upload的结果是一个StorageObject 您可以通过以下方式获取签名的URL:

$obj = $bucket->upload(...);
$url = $obj->signedUrl(new Timestamp(new DateTime('tomorrow'))); 

可以在https://github.com/GoogleCloudPlatform/google-cloud-php/tree/master/Storage/src中找到更多信息。

签名URL的信息: https : //cloud.google.com/storage/docs/access-control/signed-urls

您可以使用pathinfo()来获取文件名和扩展名。

$file = pathinfo($_FILES['file']['name']);
$prefix = uniqid('prefix_', true); //generate random string to avoid name conflicts
$filename = $prefix . "." . $file['extension'];

$bucket->upload(
  fopen($_FILES['file']['tmp_name'], 'r'),
  ['name' => $filename]
);  

这只会将带有扩展名的文件保存到GCP存储桶,但会为每个文件生成随机名称,以避免名称冲突

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM