Я могу сгенерировать подписанный URL-адрес со своего сервера и отправить его обратно в свой клиент React Native (expo).
Клиент также может отправить запрос на размещение в SignUrl с объектом изображения, который включает в себя URI для изображения, хранящегося на устройстве.
Проблема в том, что изображение, сохраненное в Google Cloud, выглядит поврежденным. Я предполагаю, что должны быть дополнительные настройки, которые я должен добавить, чтобы изображение загружалось правильно.
Код сервера для генерации URL
const { Storage } = require("@google-cloud/storage");
const storage = new Storage({keyFilename: "keys.json"});
const bucketName = "bucket";
const bucket = storage.bucket(bucketName);
const { v4 } = require("uuid");
async upload(req, res, next) {
const options = {
action: "write",
expires: Date.now() + 15 * 60 * 1000, // 15 minutes,
contentType: "image/jpeg"
};
const fileName = `1234/${v4()}.jpg`
const [url] = await bucket.file(fileName).getSignedUrl(options);
res.send(url)
}
Пример предварительно назначенного URL с сервера
const url = "https://storage.googleapis.com/bucket/1234/00bae114-87e4-4647-94d3-31115453e9bd.jpg?GoogleAccessId=id%40num.iam.gserviceaccount.com&Expires=1587297408&Signature=signaturecode"
Пример объекта изображения
const image = {
"name": "IMG_4831.JPG",
"type": "image/jpeg",
"uri": "assets-library://asset/asset.JPG?id=AC24211D-E728-44D2-8B00-29EF04EC74E0&ext=JPG"
}
Реагирует на собственный код для отправки изображения по заданному URL-адресу
import axios from "axios";
const image = {uri, type: "image/jpeg", name };
await axios.put(url, image, {
headers: { "Content-Type": "image/jpeg" }
});