Как загрузить файл в Google Cloud Bucket с помощью SignUrl - PullRequest
0 голосов
/ 19 апреля 2019

Я разрабатываю приложение Angular для отображения содержимого корзины облачного хранилища Google. Для спины я использую облачные функции Google в nodeJS

Как упоминалось в документации для загрузки файла, я создал функцию для генерации подписанного URL-адреса, но когда я отправляю свой файл с подписанным URL-адресом, в браузере возникает ошибка cors

Я тестировал с почтальоном, он загружает пустой файл

Вот моя лямбда-функция:

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

exports.generateSignedUrl = (req, res) => {
// generate signed url to use for file upload

const filename = req.query.fileName;
console.log('filename ', filename);

const filetype = req.query.fileType;
console.log('filetype ', filetype);

const bucketName = 'nx-terega-omega';

res.set('Access-Control-Allow-Origin', "*");
res.set('Access-Control-Allow-Headers', "Origin, X-Requested-With, 
Content-Type, Accept, Authorization");

if (req.query.fileName !== null && req.query.fileName !== undefined
  && req.query.fileType !== null && req.query.fileType !== undefined) 
{
generateV4UploadSignedUrl(bucketName, filename).then(function (value) 
{
  console.log('File Url response ', value);
  res.status(200).send(JSON.stringify({'url': value}));
}).catch(error => {
  res.status(404).send('Error while generating signed url');
});
} else {
res.status(500).send('Filename not found');
}
};

async function generateV4UploadSignedUrl(bucketName, filename, filetype) {
// [START storage_generate_upload_signed_url_v4]

// These options will allow temporary uploading of the file with outgoing
// Content-Type: application/octet-stream header.
const options = {
version: 'v4',
action: 'write',
expires: Date.now() + 15 * 60 * 1000, // 15 minutes
contentType: filetype,
};

// Get a v4 signed URL for uploading file
const [url] = await storage
.bucket(bucketName)
.file(filename)
.getSignedUrl(options);

console.log('Generated PUT signed URL:');
console.log(url);
console.log('You can use this URL with any user agent, for example:');
console.log("curl -X PUT -H 'Content-Type: application/octet-stream' " +`--upload-file my-file '${url}'`);

return url;
// [END storage_generate_upload_signed_url_v4]
}

Когда я получаю подписанный URL, я отправляю ему свой файл, но он возвращает

No 'Access-Control-Allow-Origin' header is present on the requested resource.

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Как уже упоминалось в ответе Брэндон Ярбро , мне пришлось настроить cors в Google Cloud. Я что-то упустил в моей конфигурации

[
 {
  "origin": ["http://example.appspot.com"],
  "responseHeader": ["*"],
  "method": ["GET", "HEAD", "DELETE", "PUT"],
  "maxAgeSeconds": 3600
 }
]

Вы должны включить PUT в method и поставить * в responseHeader, потому что Content-Type недостаточно

1 голос
/ 19 апреля 2019

Подписанные URL-адреса используют XML API GCS. Этот API допускает запросы между источниками, но не включает его по умолчанию. Вам нужно будет указать политику CORS для вашего сегмента.

Например, вы можете создать политику CORS, как показано ниже (допустим, это файл с именем policy.json):

[
    {
      "origin": ["http://example.appspot.com"],
      "responseHeader": ["Content-Type"],
      "method": ["GET", "HEAD", "DELETE"],
      "maxAgeSeconds": 3600
    }
]

Полное описание документа политики CORS здесь: https://cloud.google.com/storage/docs/xml-api/put-bucket-cors#request_body_elements

Теперь давайте применим эту политику к корзине:

gsutil cors set policy.json gs://my-bucket-name

В документации есть больше инструкций для включения CORS в корзине: https://cloud.google.com/storage/docs/configuring-cors

...