Java Google Cloud Storage загрузит медиа-ссылку null, но загрузка изображений

Я пытаюсь загрузить изображение в существующую корзину в моем облачном хранилище Google. Файл изображения успешно загружен, когда я иду и проверяю,
но возвращенный URL-адрес загрузки null

КОД

private String uploadImage(File filePath, String blobName, File uploadCreds) throws FileNotFoundException, IOException{


   Storage storage = StorageOptions.newBuilder().setProjectId("myProjectId")
                .setCredentials(ServiceAccountCredentials.fromStream(new FileInputStream(uploadCreds)))
                .build()
                .getService();

                    String bucketName = "myBucketName"; 
                    Bucket bucket = storage.get(bucketName);
        BlobId blobId = BlobId.of(bucket.getName(), blobName);
        InputStream inputStream = new FileInputStream(filePath);
        BlobInfo blobInfo = BlobInfo.newBuilder(blobId).setContentType("image/jpeg").build();


    try (WriteChannel writer = storage.writer(blobInfo)) {
        byte[] buffer = new byte[1024];
        int limit;
        try {
            while ((limit = inputStream.read(buffer)) >= 0) {
                writer.write(ByteBuffer.wrap(buffer, 0, limit));
            }

        } catch (Exception ex) {
            ex.printStackTrace();
        }finally {
            writer.close();

        }
                     System.out.println("Image URL : " + blobInfo.getMediaLink());
                     System.out.println("Blob URL : " + blobInfo.getSelfLink());
                     return blobInfo.getMediaLink();
    }


}

filePath - это файл изображения
blobName - это произвольное имя изображения
uploadCreds - это мой файл credintials.json

Почему blobInfo.getMediaLink() а также blobInfo.getSelfLink() возврате null?
Что я делаю неправильно?

2 ответа

Вот мой код, который отлично работает

@RestController @RequestMapping("/api") открытый класс CloudStorageHelper {

    Credentials credentials = GoogleCredentials.fromStream(new FileInputStream("C:\\Users\\sachinthah\\Downloads\\MCQ project -1f959c1fc3a4.json"));
    Storage storage = StorageOptions.newBuilder().setCredentials(credentials).build().getService();

    public CloudStorageHelper() throws IOException {
    }


    @SuppressWarnings("deprecation")
    @RequestMapping(method = RequestMethod.POST, value = "/imageUpload112")
    public String uploadFile(@RequestParam("fileseee")MultipartFile fileStream)
            throws IOException, ServletException {
        BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
        String bucketName = "mcqimages";
        checkFileExtension(fileStream.getName());
        DateTimeFormatter dtf = DateTimeFormat.forPattern("-YYYY-MM-dd-HHmmssSSS");
        DateTime dt = DateTime.now(DateTimeZone.UTC);

        String fileName = fileStream.getOriginalFilename()  ;

        BlobInfo blobInfo =
                storage.create(
                        BlobInfo
                                .newBuilder(bucketName, fileName)
                                .setAcl(new ArrayList<>(Arrays.asList(Acl.of(User.ofAllUsers(), Role.READER))))
                                .build(),
                        fileStream.getInputStream()
                );
        System.out.println(blobInfo.getMediaLink());

        //sachintha added a comma after the link to identify the link that get generated
           return blobInfo.getMediaLink()+",";

    }


private void checkFileExtension(String fileName) throws ServletException {
    if (fileName != null && !fileName.isEmpty() && fileName.contains(".")) {
        String[] allowedExt = {".jpg", ".jpeg", ".png", ".gif"};
        for (String ext : allowedExt) {
            if (fileName.endsWith(ext)) {
                return;
            }
        }
        throw new ServletException("file must be an image");
    }
}

Ответ был довольно прост, я просто избавился от метода ручной загрузки и использовал встроенный BLOB-объект create.

private String uploadImage(File filePath, String blobName, File uploadCreds) throws FileNotFoundException, IOException{


   Storage storage = StorageOptions.newBuilder().setProjectId("porjectId")
                .setCredentials(ServiceAccountCredentials.fromStream(new FileInputStream(uploadCreds)))
                .build()
                .getService();

                    String bucketName = "bucketName"; 
                    Bucket bucket = storage.get(bucketName);
        BlobId blobId = BlobId.of(bucket.getName(), blobName);
        InputStream inputStream = new FileInputStream(filePath);
        BlobInfo blobInfo = BlobInfo.newBuilder(blobId).setContentType("image/jpeg").build();


                    Blob blob = storage.create(blobInfo, inputStream);


                     System.out.println("Image URL : " +  blob.getMediaLink());

           return  blob.getMediaLink();



}

Если вы хотите сохранить его в специальной папке, получите blobinfo.name() и добавьте к нему "/". например, если необходимо сохранить temp.jpg с папками с датами. получить объект date from date и отформатировать его с помощью средства форматирования даты и добавить его

blobinfo.name() = date+"/"+blobinfo.name();

классифицирует все изображения по дате.

Другие вопросы по тегам