Я сохранил файл PDF в AWS S3, но не могу загрузить его из Chrome / Safari с помощью https (ERR_HTTP2_PROTOCOL_ERROR) - PullRequest
0 голосов
/ 29 февраля 2020

В Firefox (http / https) или Chrome / Safari (http) Я могу скачать его без проблем.

Код для сохранения:

saveBase64BinaryFile(SaveBinaryFile.builder()
  .namespace("namespace")
  .fileName(s"Schët-faktura_№143_ot_21_fevralya_2020.pdf")
  .contentType("application/pdf; charset=utf-8")
  .data(getFile)
  .build())


def saveBase64BinaryFile(cmd: SaveBinaryFile)(implicit context: Context): Future[FileInfo] =
  upload(
    namespace = cmd.getNamespace,
    fileName = cmd.getFileName,
    src = Source.fromFuture(Future.successful(ByteString(cmd.getData))),
    contentType = cmd.getContentType
  )

def upload(namespace: String, fileName: String, src: Source[ByteString, Any], contentType: String = null) = Future({
  val inputStream = src.runWith(StreamConverters.asInputStream())
  val fileId = UUID.randomUUID().toString
  val meta = new ObjectMetadata
  val bytes = IOUtils.toByteArray(inputStream)
  meta.setContentLength(bytes.length)
  meta.setUserMetadata(Map(
    FileNameHeader    → Base64.getEncoder.encodeToString(fileName.getBytes(Charsets.UTF_8)),
    ContentTypeHeader → contentType,
  ).asJava)
  s3Client.putObject(bucketName, s3Path(namespace, fileId), new ByteArrayInputStream(bytes), meta)
  FileInfo.builder()
    .fileId(fileId)
    .size(meta.getContentLength)
    .contentType(contentType)
    .name(fileName)
    .build()
})(blockEc)

Код для загрузки:

def download(namespace: String, fileId: String): Future[(FileInfo, InputStream)] = Future({
  val obj = try s3Client.getObject(bucketName, s3Path(namespace, fileId)) catch {
    case e: AmazonS3Exception if e.getStatusCode == 404 ⇒ throw new NotFoundError("File not found!")
  }
  val fileName = obj.getObjectMetadata.getUserMetadata.get(FileNameHeader) match {
    case null ⇒ "file"
    case encoded ⇒ new String(Base64.getDecoder.decode(encoded), Charsets.UTF_8)
  }
  (FileInfo.builder()
    .fileId(fileId)
    .name(fileName)
    .size(obj.getObjectMetadata.getContentLength)
    .contentType(obj.getObjectMetadata.getUserMetadata.getOrDefault(ContentTypeHeader, null))
    .build(),
    obj.getObjectContent)
})(blockEc)

Результат при попытке открыть ссылку на файл из Chrome / Safari:

Этот сайт недоступен

Веб-страница на [ссылка ] может быть временно недоступен или он постоянно перемещен на новый веб-адрес. ERR_HTTP2_PROTOCOL_ERROR

где может быть проблема?

Я пытался изменить кодировку, добавить метаданные в S3. Ничего не помогает.

Раньше архив с pdf docs можно было скачать и все работало. Но для одного документа случается что-то странное.

1 Ответ

0 голосов
/ 29 февраля 2020

Проблемой стал специальный символ «№». Для загружаемых архивов имена были простыми, например, «ARCHIVE.zip». Поэтому проверьте, чтобы сохранить файл с простым именем, и если он может быть загружен, у вас есть проблема с именованием. Но я не могу понять, почему chrome и сафари с подключением https не хотят сохранять файл. Может, кто-нибудь объяснит, почему некоторые браузеры ведут себя так странно?

...