Облачное хранилище Google | PHP | Загруженные файлы имеют размер 0 байт

#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 дважды, вы можете удалить один из этих вызовов.