2
votes

I want to upload files to Google Cloud Storage (Bucket) through my PHP or JavaScript application which is hosted in my localhost or external server.

As I tried the Google Cloud Storage has the dedicated support to upload files from Google App Engine but that's not I want to achieve.

Since I went through this link which is give idea on Google JSON APIs: https://cloud.google.com/storage/docs/json_api/v1/how-tos/simple-upload

However this is not a helpful resource as I tried.

Scenario:

I have a localhost PHP application with HTML form of file upload button, once I submitted the form it should upload the chosen file to my Google Bucket with cURL - API or any client side scripting.

// Like below I want to send to Google Bucket
move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)

Peaceful guides are most appreciated than down votes.

3

3 Answers

2
votes

In order to upload files to Google Cloud Storage from outside of App Engine or from your external server you have to install the client library of the programming language you use.

Step 1:
Create a Google Service Account Key from the below URL and download the json file which has all of your crenditial information to login from the client PC.
https://console.cloud.google.com/apis/credentials

Step 2:


PHP:

Install composer require google/cloud-storage

<?php

# Includes the autoloader for libraries installed with composer
require __DIR__ . '/vendor/autoload.php';

use Google\Cloud\Storage\StorageClient;
use google\appengine\api\cloud_storage\CloudStorageTools;

# Your Google Cloud Platform project ID
$projectId = 'your_project_id';

# Instantiates a client
$storage = new StorageClient([
    'projectId' => $projectId,
    'keyFilePath' => 'service_account_key_json_file.json'
]);

# The name for the bucket
$bucket = $storage->bucket('bucket_name');

foreach ($bucket->objects() as $object) {
    echo "https://storage.googleapis.com/".$bucket->name()."/".$object->name().'<br>';
}

if(isset($_POST['submit'])) {

    $file = file_get_contents($_FILES['file']['tmp_name']);
    $objectName = $_FILES["file"]["name"];

    $object = $bucket->upload($file, [
        'name' => $objectName
    ]);

    echo "https://storage.googleapis.com/".$bucket->name()."/".$objectname;
}
?>


JavaScript (NodeJs):

Install npm install --save @google-cloud/storage

'use strict';

const express = require('express');
const formidable = require('formidable');
const fs = require('fs');
const path = require('path');

const { Storage } = require('@google-cloud/storage');
const Multer = require('multer');

const CLOUD_BUCKET = process.env.GCLOUD_STORAGE_BUCKET || 'bucket_name';
const PROJECT_ID = process.env.GCLOUD_STORAGE_BUCKET || 'project_id';
const KEY_FILE = process.env.GCLOUD_KEY_FILE || 'service_account_key_file.json';
const PORT = process.env.PORT || 8080;

const storage = new Storage({
  projectId: PROJECT_ID,
  keyFilename: KEY_FILE
});

const bucket = storage.bucket(CLOUD_BUCKET);

const multer = Multer({
  storage: Multer.MemoryStorage,
  limits: {
    fileSize: 2 * 1024 * 1024 // no larger than 5mb
  }
});

const app = express();

app.use('/blog', express.static('blog/dist'));

app.get('/', async (req, res) => {

  console.log(process.env);

  const [files] = await bucket.getFiles();

  res.writeHead(200, { 'Content-Type': 'text/html' });

  files.forEach(file => {
    res.write(`<div>* ${file.name}</div>`);
    console.log(file.name);
  });

  return res.end();

});

app.get("/gupload", (req, res) => {
  res.sendFile(path.join(`${__dirname}/index.html`));
});

// Process the file upload and upload to Google Cloud Storage.
app.post("/pupload", multer.single("file"), (req, res, next) => {

  if (!req.file) {
    res.status(400).send("No file uploaded.");
    return;
  }

  // Create a new blob in the bucket and upload the file data.
  const blob = bucket.file(req.file.originalname);

  // Make sure to set the contentType metadata for the browser to be able
  // to render the image instead of downloading the file (default behavior)
  const blobStream = blob.createWriteStream({
    metadata: {
      contentType: req.file.mimetype
    }
  });

  blobStream.on("error", err => {
    next(err);
    return;
  });

  blobStream.on("finish", () => {
    // The public URL can be used to directly access the file via HTTP.
    const publicUrl = `https://storage.googleapis.com/${bucket.name}/${blob.name}`;

    // Make the image public to the web (since we'll be displaying it in browser)
    blob.makePublic().then(() => {
      res.status(200).send(`Success!\n Image uploaded to ${publicUrl}`);
    });
  });

  blobStream.end(req.file.buffer);

});

// Start the server
app.listen(PORT, () => {
  console.log(`App listening on port ${PORT}`);
  console.log('Press Ctrl+C to quit.');
});

Refer example https://github.com/aslamanver/google-cloud-nodejs-client

0
votes

You can do it creating an upload URL. With that, an user can upload files to GCS using a HTML form, check this documentation. It has all the information to do it using PHP.

0
votes

I wrote a package to download / get local file and upload to Google Cloud Storage, maybe it help you: https://github.com/jeansouzak/duf

use JeanSouzaK\Duf\Duff;
use JeanSouzaK\Duf\Prepare\WebResource;
use JeanSouzaK\Duf\Prepare\LocalResource;

$duf = Duff::getInstance(Duff::GOOGLE_CLOUD_STORAGE, [
    'project_id' => 'storage-test-227305',
    'key_path' => '/home/env/storage-test-227305-8472347a39489.json'
]);

// - Chaining example -
$uploadResults = $duf->prepare([
    new LocalResource('imagem', '/home/test/images/test.jpg'),
    new WebResource('teste.png', 'https://dummyimage.com/600x400/000/fff')
])->download()->addBucket('your-bucket-name')->upload();