Mantofka
Mantofka

Reputation: 286

Firebase function: Error: unable to open for write

so I was trying to implement a firebase function. I went to firebase functions repository example and copied it. Everything is working properly "Deploy complete!" with no signs of an error. However, when I'm trying to upload image to the firebase store, firebase functions can't open it?

There is a code that I used:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp()
const {Storage} = require("@google-cloud/storage");
const gcs = new Storage();
const path = require('path');
const os = require('os');
const fs = require('fs');
const sharp = require("sharp");

exports.generateThumbnail = functions.storage.object().onFinalize(async (object) => {

  const fileBucket = object.bucket; // The Storage bucket that contains the file.
  const filePath = object.name; // File path in the bucket.
  const contentType = object.contentType; // File content type.
  const metageneration = object.metageneration; // Number of times metadata has been generated. New objects have a value of 1.

  if (!contentType.startsWith('image/')) {
    return console.log('This is not an image.');
  }

  const fileName = path.basename(filePath);

  if (fileName.startsWith('thumb_')) {
    return console.log('Already a Thumbnail.');
  }

  const bucket = admin.storage().bucket(fileBucket);
  const tempFilePath = path.join(os.tmpdir(), fileName);
  console.log('Created temporary path',tempFilePath);
  const metadata = {
    contentType: contentType,
  };
  await bucket.file(filePath).download({destination: tempFilePath});
  console.log('Image downloaded locally to', tempFilePath);

  const thumbFileName = `thumb_${fileName}`;
  const thumbFilePath = path.join(path.dirname(filePath), thumbFileName);
  console.log('Created thumb path',tempFilePath);
  const size = 200;

  /*await*/ sharp(tempFilePath).resize(size,size).toFile(thumbFilePath);

  await bucket.upload(tempFilePath, {
    destination: filePath,
    metadata: metadata,
  });
  
  return fs.unlinkSync(tempFilePath);
});

Error:

enter image description here

Upvotes: 1

Views: 668

Answers (2)

questionto42
questionto42

Reputation: 9562

I guess that this will work also in Firebase, else please comment:

gcsfs

If you put gcsfs in the "requirements.txt" and import gcsfs in the Python code, you can use the module like this (as an example taken from Have a look at an example for saving a csv:

fs = gcsfs.GCSFileSystem(project=MY_PROJECT)
fs.ls(BUCKET_NAME)
# or choose 'w' here:
with fs.open(filepath, 'wb') as outcsv:
    ...

Further links:

Upvotes: 0

marian.vladoi
marian.vladoi

Reputation: 8066

Cloud Functions has a read-only filesystem except for the /tmp directory. You have to make sure you are writing your data to a path /tmp/your-file

The only writeable part of the filesystem is the /tmp directory, which you can use to store temporary files in a function instance. This is a local disk mount point known as a "tmpfs" volume in which data written to the volume is stored in memory. Note that it will consume memory resources provisioned for the function.

Cloud Functions Execution Environment

Upvotes: 2

Related Questions