Загрузите файл в Google Cloud Storage Bucket с помощью PHP и 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.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: Загрузите файл в Google Cloud Storage Bucket с помощью PHP и Ajax

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?

Помоги мне, пожалуйста!

Заранее спасибо!

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
4 293
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

добавить параметры $ 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

Привет, @Dat_Tran, могу ли я получить URL-адрес файла после загрузки в корзину облачного хранилища Google?

Abdul Rehman 03.08.2018 19:32

Я обновил ответ, добавив информацию об URL. Пожалуйста, примите мой ответ, если вы обнаружите, что он решает вашу проблему в вопросе.

Dat Tran 04.08.2018 02:34

Вы можете использовать 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, но генерирует случайное имя для каждого файла, чтобы избежать конфликтов имен.

Другие вопросы по теме