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 Goog
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.
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:
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;
}
?>
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
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();