Я работаю над проектом с использованием Google Cloud Storage, чтобы пользователи могли загружать медиафайлы в предопределенное ведро с помощью Node.js. Я тестировал небольшие файлы .jpg
. Я также использовал gsutil
для установки разрешений ведра для публики.Google Cloud Storage создает ссылки на контент с непоследовательным поведением
Сначала все файлы сгенерировали ссылки, загружавшие файл. После изучения документов я узнал, что после загрузки с помощью gsutil
CLI я могу явно указать Content-Type
каждого файла. Когда я использовал эту процедуру, чтобы установить тип файла 'image/jpeg'
, поведение ссылки изменилось, чтобы отобразить изображение в браузере. Но это работает только в том случае, если ссылка не была предварительно нажата до обновления метаданных с помощью gsutil
. Я думал, что это может быть связано с кешированием браузера, но поведение дублируется в браузере инкогнито.
Использование gsutil
, чтобы установить тип мима будет непрактичен, во всяком случае, так что я изменил код в моем сервере узла POST
функции для установки метаданных во время загрузки, используя npm
модуль под названием mime
. Вот код:
app.post('/api/assets', multer.single('qqfile'), function (req, res, next) {
console.log(req.file);
if (!req.file) {
return ('400 - No file uploaded.');
}
// Create a new blob in the bucket and upload the file data.
var blob = bucket.file(req.file.originalname);
var blobStream = blob.createWriteStream();
var metadata = {
contentType: mime.lookup(req.file.originalname)
};
blobStream.on('error', function (err) {
return next(err);
});
blobStream.on('finish', function() {
blob.setMetadata(metadata, function(err, response){
console.log(response);
// The public URL can be used to directly access the file via HTTP.
var publicUrl = format(
'https://storage.googleapis.com/%s/%s',
bucket.name, blob.name);
res.status(200).send(
{
'success': true,
'publicUrl': publicUrl,
'mediaLink': response.mediaLink
});
});
});
blobStream.end(req.file.buffer);
});
Это похоже на работу, с точки зрения, что он в действительности устанавливает Content-Type
при загрузке, и это правильно отражены в объекте ответа, а также консоли Cloud Storage. Проблема в том, что некоторые из ссылок, возвращаемых как publicUrl
, вызывают загрузку файла, а другие - загрузку изображения браузером. В идеале я хотел бы иметь оба варианта, но я не вижу различий в хранящихся файлах или их метаданных.
Что мне здесь не хватает?
Я прошел и проверил, что все файлы правильно помечены соответствующим типом mime, и ни один из них не отмечен 'application-octet-stream'. Кроме того, я подтвердил, что значение «Content-Disposition» не было установлено, но только для overkill явно добавила строку в код сервера, чтобы пометить это как null в метаданных. По прихоти я дублировал один из них. jpg' и изменили расширение на '.jpeg'. Файл '.jpeg' загружается правильно, а версия' .jpg 'все еще загружается. Точный файл. Но другие с расширением '.jpg' работают просто отлично. – espressoAndCode
Интересно. И это использует URL-адреса, которые только «https://storage.googleapis.com/bucketName/imageName.jpg» или «imageName».jpeg "в браузере? –
Это правильно. Я только что проверил еще один тест, в котором я явно добавил значение 'Content-Disposition' '' inline 'для метаданных при загрузке. Я удалил все файлы на хранение и перезагрузил оба описанные выше варианты .jpeg. Объект ответа * и * консоль Cloud Storage подтверждают, что тип и расположение mime установлены так, как ожидалось. Только на этот раз я получаю абсолютно противоположное поведение. '.jpeg' файл отображается в браузере, а загрузка '.jpg' загружается. Разочарование! – espressoAndCode