4
votes

I've searched a lot (and even found some helpful links like this one Upload a file to Google Cloud Storage Bucket with PHP and Ajax) but I couldn't get it working. I need to upload a txt file to my google cloud storage bucket.

Here's my code:

gcp_storage.php:

<?php

if(isset($_FILES['file'])){
    $errors= array();
    // Authentication with Google Cloud Platform
    $client = new StorageClient(['keyFilePath' => 'cloudtest-2412**-a66e94ba56**.json']);
    $bucket = $client->bucket('cloudtest-2412**.appspot.com ');

    // Upload a file to the bucket.
    $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]
    );  
}

?>

html and js:

<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>

</html>

<script
  src="https://code.jquery.com/jquery-3.4.1.min.js"
  integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
  crossorigin="anonymous"></script>

<script>

    $(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);
        }
    });
});

</script>

*It shows on my console success but when I go to my bucket on google cloud, nothing appears...

*I downloaded the .json file from the IAM page (the file is in the same directory as the other filse)

EDIT 1:

Don't know if this really helps, if I remove the use Google\Cloud\Storage\StorageClient, PHP throws me the error Class 'StorageClient' not found in /base/data/home/apps/i (when I put back the use code it just throws the 500 error, see below)

I've been changing the code and putting breakpoints to see if I find where the 500 error is coming from. If I remove everything from my PHP file and just put echo "Test", it works fine.

After putting some breakpoints at the original code, I found out that the 500 error comes from this lines of code:

$client = new StorageClient(['keyFilePath' => 'cloudtest-2412**-a66e94ba56**.json']);
$bucket = $client->bucket('cloudtest-2412**.appspot.com');

(The authentication code)

Any suggestions?

Thanks

1
Are you using standard or flexible environment? - TasosV
Standard (I didn't really understand the difference between the two, so I chose Standard, but I wouldn't have a problem changing if needed) - Lucas Heise
What do the error logs show when the upload is attempted? - Grayside
In this code, it doesn't return any error, it shows "success" on my console. success: function ($data) { console.log('Succcess'); $('#success').attr('hidden', false); }. Where should I add some code to display the possible errors? - Lucas Heise
Actually I managed to get to display an error message, now it shows error 500 (server) @Grayside - Lucas Heise

1 Answers

0
votes

I think, we can see a permission error. In most cases, an internal 500 server error is due to incorrect permission in one or more files or folders.

Please try with this steps: https://cloud.google.com/docs/authentication/production#providing_credentials_to_your_application