Я работаю над проектом 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.info('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?
Помоги мне, пожалуйста!
Заранее спасибо!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


добавить параметры $ 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-> загрузить является 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
Я обновил ответ, добавив информацию об URL. Пожалуйста, примите мой ответ, если вы обнаружите, что он решает вашу проблему в вопросе.
Вы можете использовать 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, но генерирует случайное имя для каждого файла, чтобы избежать конфликтов имен.
Привет, @Dat_Tran, могу ли я получить URL-адрес файла после загрузки в корзину облачного хранилища Google?