使用 PHP 和 Ajax 将文件上传到 Google Cloud Storage Bucket
Upload a file to Google Cloud Storage Bucket with PHP and Ajax
我正在开展一个 PHP 项目,我需要将文件(由 HTML 表格提供)上传到 Google 云存储桶。表单请求将作为 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>
Here's how an image file looks inside bucket:
Update:
现在,我改变了:
这个:
// 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 中找到更多信息。
签名URLS的信息: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 存储桶的文件,还会为每个文件生成随机名称以避免名称冲突
我正在开展一个 PHP 项目,我需要将文件(由 HTML 表格提供)上传到 Google 云存储桶。表单请求将作为 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>
Here's how an image file looks inside bucket:
Update:
现在,我改变了:
这个:
// 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 中找到更多信息。
签名URLS的信息: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 存储桶的文件,还会为每个文件生成随机名称以避免名称冲突