2016-11-18 3 views
0

Я работаю над проектом с использованием 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, вызывают загрузку файла, а другие - загрузку изображения браузером. В идеале я хотел бы иметь оба варианта, но я не вижу различий в хранящихся файлах или их метаданных.

Что мне здесь не хватает?

ответ

0

Google Cloud Storage не делает никаких предположений о типах загружаемых объектов контента. Если вы не укажете, GCS просто назначит тип «application/octet-stream».

Инструмент командной строки gsutil, однако, более умный и будет прикреплять правильный Content-Type к файлам, загружаемым в большинстве случаев, включая JPEG.

Теперь у вас есть две причины, по которым ваш браузер может загружать изображения, а не отображать их. Во-первых, если для Content-Type установлено значение «application/octet-stream», большинство браузеров будут загружать результаты в виде файла, а не отображать их. Вероятно, это произошло в вашем случае.

Вторая причина заключается в том, что сервер отвечает заголовком Content-Disposition: attachment. Это обычно не происходит, когда вы извлекаете объекты GCS с хоста «storage.googleapis.com», как вы делаете это выше, но можете, если вы, например, явно указали contentDisposition для объекта, который вы загрузили.

По этой причине я подозреваю, что некоторые из ваших объектов не имеют типа содержимого «image/jpeg». Вы могли бы пройти и установить их все с gsutil следующим образом: gsutil -m setmeta 'Content-Type:image/jpeg' gs://myBucketName/**

+0

Я прошел и проверил, что все файлы правильно помечены соответствующим типом mime, и ни один из них не отмечен 'application-octet-stream'. Кроме того, я подтвердил, что значение «Content-Disposition» не было установлено, но только для overkill явно добавила строку в код сервера, чтобы пометить это как null в метаданных. По прихоти я дублировал один из них. jpg' и изменили расширение на '.jpeg'. Файл '.jpeg' загружается правильно, а версия' .jpg 'все еще загружается. Точный файл. Но другие с расширением '.jpg' работают просто отлично. – espressoAndCode

+0

Интересно. И это использует URL-адреса, которые только «https://storage.googleapis.com/bucketName/imageName.jpg» или «imageName».jpeg "в браузере? –

+0

Это правильно. Я только что проверил еще один тест, в котором я явно добавил значение 'Content-Disposition' '' inline 'для метаданных при загрузке. Я удалил все файлы на хранение и перезагрузил оба описанные выше варианты .jpeg. Объект ответа * и * консоль Cloud Storage подтверждают, что тип и расположение mime установлены так, как ожидалось. Только на этот раз я получаю абсолютно противоположное поведение. '.jpeg' файл отображается в браузере, а загрузка '.jpg' загружается. Разочарование! – espressoAndCode

 Смежные вопросы

  • Нет связанных вопросов^_^