Как использовать bucket.upload () вместо file.createWriteStream () в Google Cloud Storage? - PullRequest
0 голосов
/ 28 апреля 2019

Я пытаюсь получить постоянный (без знака) URL-адрес для загрузки после загрузки файла в Google Cloud Storage. Я могу получить подписанный URL-адрес загрузки, используя file.createWriteStream(), но file.createWriteStream() не возвращает UploadResponse, который включает в себя неподписанный URL-адрес загрузки. bucket.upload() включает UploadResponse и Получить URL-адрес загрузки из файла, загруженного с помощью облачных функций для Firebase * имеет несколько ответов, объясняющих, как получить неподписанный URL-адрес загрузки из UploadResponse. Как мне изменить file.createWriteStream() в моем коде на bucket.upload()? Вот мой код:

const {Storage} = require('@google-cloud/storage');
const storage = new Storage({ projectId: 'my-app' });
const bucket = storage.bucket('my-app.appspot.com');
var file = bucket.file('Audio/' + longLanguage + '/' + pronunciation + '/' + wordFileType);

const config = {
  action: 'read',
  expires: '03-17-2025',
  content_type: 'audio/mp3'
};

function oedPromise() {
  return new Promise(function(resolve, reject) {
    http.get(oedAudioURL, function(response) {
        response.pipe(file.createWriteStream(options))
        .on('error', function(error) {
          console.error(error);
          reject(error);
        })
        .on('finish', function() {
          file.getSignedUrl(config, function(err, url) {
            if (err) {
              console.error(err);
              return;
            } else {
              resolve(url);
            }
          });
        });
      });
    });
  }

Я попробовал это, это не сработало:

  function oedPromise() {
    return new Promise(function(resolve, reject) {
      http.get(oedAudioURL, function(response) {
        bucket.upload(response, options)
        .then(function(uploadResponse) {
          console.log('Then do something with UploadResponse.');
        })
        .catch(error => console.error(error));
      });
    });
  }

Сообщение об ошибке было Path must be a string. Другими словами, response является переменной, но должна быть строкой.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

Вы можете сделать определенный файл в корзине общедоступным для чтения с помощью метода makePublic .

Из документов:

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

// 'my-bucket' is your bucket's name
const myBucket = storage.bucket('my-bucket');

// 'my-file' is the path to your file inside your bucket
const file = myBucket.file('my-file');

file.makePublic(function(err, apiResponse) {});

//-
// If the callback is omitted, we'll return a Promise.
//-
file.makePublic().then(function(data) {
  const apiResponse = data[0];
});

Теперь URI http://storage.googleapis.com/[BUCKET_NAME]/[OBJECT_NAME] является публичной ссылкой на файл, как объяснено здесь .

Дело в том, что вам нужен только этот минимальный код, чтобы сделать объект общедоступным, например, с помощью функции Cloud. Тогда вы уже знаете, что такое общедоступная ссылка, и можете использовать ее непосредственно в своем приложении.

0 голосов
/ 29 апреля 2019

bucket.upload() - это удобная оболочка для file.createWriteStream(), которая берет путь локальной файловой системы и загружает файл в корзину как объект:

bucket.upload("path/to/local/file.ext", options)
  .then(() => {
    // upload has completed
  });

Чтобы сгенерировать подписанный URL-адрес, вам нужно получить объект файла из корзины:

const theFile = bucket.file('file_name');

Имя файла будет либо именем вашего локального файла, либо, если вы указали альтернативное удаленное имя options.destination для файла в GCS.

Затем используйте File.getSignedUrl(), чтобы получить подписанный URL:

bucket.upload("path/to/local/file.ext", options)
  .then(() => {
    const theFile = bucket.file('file.ext');
    return theFile.getSignedURL(signedUrlOptions); // getSignedURL returns a Promise
  })
  .then((signedUrl) => {
    // do something with the signedURL
  });

См .:

Bucket.upload() документация

File.getSignedUrl() документация

...