#codeigniter #google-app-engine #upload #google-cloud-storage
#codeigniter #google-app-engine #загрузка #google-облачное хранилище
Вопрос:
Я использую приложение Codeigniter и пытаюсь предоставить пользователям доступ к загрузке файлов. сервер настроен на виртуальной машине Google Compute Engine под управлением CentOS 7 и Apache 2, я пытаюсь использовать облачное хранилище Google для загрузки пользователем. В настоящее время, когда я загружаю файлы, в корзину GCS загружаются только имена файлов с размером файла 0 байт.
Мой интерфейс-код:
<body>
<form action="/includes/includes_gc/do_upload" class="dropzone" id="pfUploads" enctype="multipart/form-data">
</form>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.1/min/dropzone.min.js"></script>
<script>
Dropzone.options.pfUploads = {
paramName: "file",
uploadMultiple: true,
init: function () {
this.on('complete', function (data) {
console.log(data);
});
}
};
</script>
</body>
Функция контроллера:
public function do_upload() {
if ($_FILES) {
$filename = $_FILES['file']['name'];
$gs_name = file_get_contents($_FILES['file']['tmp_name']);
$bucketName = 'xxxxxx.appspot.com';
$kdir = dirname(getcwd(), 2);
$storage = new StorageClient([
'keyFile' => json_decode(file_get_contents($kdir . DIRECTORY_SEPARATOR . 'xxxxxx.json'), true),
'projectId' => 'xxxxxx'
]);
$file = fopen($gs_name, 'r');
$bucket = $storage->bucket($bucketName);
$bucket->upload($file, [
'name' => $filename
]);
$test = array();
array_push($test, basename($gs_name));
array_push($test, $bucketName);
array_push($test, $filename);
echo json_encode($test);
}
}
Я был бы признателен за любую помощь в решении этой проблемы.
Заранее спасибо. Naveen
Ответ №1:
Вы присваиваете переменной gs_name
возвращаемое значение функции file_get_contents и передаете эту переменную в функцию fopen.
Если имя пути не совпадает с содержимым такого файла, что обычно ожидается, fopen
возвращает значение false.
Итак, вы передаете значение false в качестве первого параметра в $bucket-> upload, который эффективно создает большой двоичный объект размером 0 байт с именем, которое вы указали в соответствующей корзине.
Итак, в итоге должно сработать следующее:
public function do_upload() {
if ($_FILES) {
$filename = $_FILES['file']['name'];
$gs_name = $_FILES['file']['tmp_name'];
$file = file_get_contents($gs_name);
$bucketName = 'xxxxxx.appspot.com';
$kdir = dirname(getcwd(), 2);
$storage = new StorageClient([
'keyFile' => json_decode(file_get_contents($kdir . DIRECTORY_SEPARATOR . 'xxxxxx.json'), true),
'projectId' => 'xxxxxx'
]);
$bucket = $storage->bucket($bucketName);
$bucket->upload($file, [
'name' => $filename
]);
}
}
Также имейте в виду, что вы можете использовать возвращаемое значение upload
метода, например:
$storage_object = $bucket->upload($file, ['name' => $filename]);
Для дальнейшей обработки.
Комментарии:
1. Большое спасибо за ваш ответ, друзья……. Я перепробовал все, как вы упомянули, и, к сожалению, результат все тот же. при загрузке — o байт. я не уверен, делаю ли я что-то еще неправильно.
Ответ №2:
@fhenriques… еще раз я хотел бы поблагодарить вас за вашу помощь и руководство. Я немного поиграл и внес некоторые изменения.
if (!empty($_FILES)) {
foreach ($_FILES['file']['tmp_name'] as $key => $tmp_name) {
$filename = $_FILES['file']['name'][$key];
$gs_name = $_FILES['file']['tmp_name'][$key];
$file = file_get_contents($gs_name);
$bucketName = 'xxxxxx.appspot.com';
$kdir = dirname(getcwd(), 2);
$storage = new StorageClient([
'keyFile' => json_decode(file_get_contents($kdir . DIRECTORY_SEPARATOR . 'xxxxxx.json'), true),
'projectId' => 'xxxxxx'
]);
$bucket = $storage->bucket($bucketName);
$bucket->upload($file, [
'name' => $filename
]);
$storage_object = $bucket->upload($file, ['name' => $filename]);
return $storage_object;
}
}
Теперь это помогло мне заставить загрузки работать. большое спасибо за ваше руководство. Я ценю вашу помощь.
Комментарии:
1. Приятно это слышать, имейте в виду, что вы вызываете
$bucket->upload
дважды, вы можете удалить один из этих вызовов.