Облачное хранилище - тип содержимого файла отображается в виде данных при загрузке изображения - PullRequest
0 голосов
/ 30 октября 2018

Я загружаю изображения в облачное хранилище с помощью клиентской библиотеки Java Изображения загружаются в Bucket, но когда я пытаюсь получить к ним доступ, в браузере отображается черный экран. Итак, я покопался в этом, чтобы проверить тип изображения после его загрузки в облачное хранилище.

Я загрузил изображение, загруженное из облачного хранилища, в Проверьте тип файла .com и он показывает тип файла как data и MIME / TYPE как application / octet-stream вместо image

enter image description here

Итак, я загрузил исходное изображение этого же изображения с моего ПК, и оно прекрасно показывает тип изображения как image / jpeg

enter image description here

Вот код, который я написал с использованием клиентской библиотеки Java.

HTML-форма для обработки загрузки

<form action="/through" method="post" enctype="multipart/form-data">
<h3>Uploading File through App Engine instances to cloud storage</h3>
<label>Enter Your Team Name</label><br>
<input type="text" name="TeamName" ><br><br> 
<label>Upload Team Logo</label><br>
<input type="file" name="teamLogo" required="required"><br><br>
<input type="submit" value="Upload Team Logo">
</form>

Java-код для загрузки изображения

InputStream input = request.getInputStream();
ByteArrayOutputStream byteArrayStream = new ByteArrayOutputStream();
try {
  int read = input.read();
  while(read != -1) {
    byteArrayStream.write(read);
    read = input.read();
  }
catch (IOException e){
  //Handle Exception 
}

byte[] fileBytes = byteArrayStream.toByteArray();

Storage storage = null;
    try {
        FileInputStream credentialsStream = new FileInputStream("JSONFile");
        Credentials credentials = GoogleCredentials.fromStream(credentialsStream);
        storage = StorageOptions.newBuilder().setCredentials(credentials).setProjectId("myProjectID").build().getService();

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    BlobId blobId = BlobId.of(BUCKET_NAME, USER_NAME+"TeamLogo.jpg");
    BlobInfo blobInfo = BlobInfo.newBuilder(blobId).setContentType("image/jpeg").build();
    Blob blob = storage.create(blobInfo, fileBytes);

Почему Cloud Storage не может правильно определить тип изображения? Это оказывает неблагоприятное влияние на другие части моего приложения, где я хочу отображать те же изображения.

UPDATE

В консоли для того же объекта Content-Type отображается как image / jpeg

enter image description here

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Попробуйте этот код:

package com.example.storage;

import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;
import com.google.cloud.storage.Blob;
import com.google.cloud.storage.BlobId;
import com.google.cloud.storage.BlobInfo;

import java.io.File;
import java.nio.file.Files;
public class QuickstartSample {
  public static void main(String... args) throws Exception {
    File fi = new File("source.jpg");
    Storage storage = StorageOptions.getDefaultInstance().getService();
    BlobId blobId = BlobId.of("your-bucket", "imagen.jpg");
    BlobInfo blobInfo = BlobInfo.newBuilder(blobId).setContentType("image/jpeg").build();
    Blob blob = storage.create(blobInfo, Files.readAllBytes(fi.toPath()));
    System.out.println(blob.getContentType());
  }
}

Я получил следующий результат на CheckFileType : enter image description here

0 голосов
/ 30 октября 2018

Вместо того, чтобы загружать файл в локальный экземпляр и затем перемещать его в облачное хранилище, вы можете указать клиентскому приложению напрямую загрузить файл в облачное хранилище, используя возобновляемую загрузку .

Если вам нужно сначала получить файл в локальном экземпляре (например, для некоторой обработки перед его загрузкой), вы можете использовать:

ByteArrayOutputStream buffer = new ByteArrayOutputStream();

int nRead;
byte[] data = new byte[16384];

while ((nRead = inStream.read(data, 0, data.length)) != -1) {
  buffer.write(data, 0, nRead);
}

buffer.flush();
...