Загрузка Firebase в Java Spring Boot

Я пытаюсь загрузить файл в хранилище Firebase в Java Spring Boot. Я просмотрел Stack Overflow и другие сайты в Интернете, но пока не нашел рабочего решения. Пожалуйста, помогите и заранее спасибо!

Пока у меня есть следующий код ниже, основанный на коде этот вопрос:

// Input Firebase credentials:
FileInputStream serviceAccount = new FileInputStream("{{path to the keys}}");
FirebaseOptions options = new FirebaseOptions.Builder()
                  .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                  .setDatabaseUrl("{{url}}")
                  .build();
FirebaseApp.initializeApp(options);

// Other Firebase variables:
FirebaseApp storage = FirebaseApp.getInstance();

// Upload to Firebase:
BlobId blobId = BlobId.of("bucket", "blob_name");
BlobInfo blobInfo = BlobInfo.newBuilder(blobId).setContentType("text/plain").build();
Blob blob = storage.create(blobInfo, "Hello, Cloud Storage!".getBytes(UTF_8));

Однако я не могу запустить это, так как получаю следующую ошибку:

UTF_8 cannot be resolved to a variable

Если я удалю часть UTF_8, я получу следующую ошибку:

The method create(BlobInfo, byte[]) is undefined for the type Object

Что вы ожидаете от UTF_8? В сообщении об ошибке говорится, что это не переменная, поэтому вы не должны были ее определять. Вы действительно хотите использовать строку «UTF-8»?

Doug Stevenson 19.03.2019 00:40

Привет, Дуг, я наткнулся на код «UTF_8» здесь: stackoverflow.com/questions/52928262/…. Я пробовал «UTF-8», но теперь «создать» выдает ошибку: «Метод create (BlobInfo, byte []) не определен для типа Object».

qccaprospect 19.03.2019 00:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
2
1 580
1

Ответы 1

Вы можете попробовать это:

  1. Создайте класс, чтобы представить его как веб-службу в вашем API:
import com.yourcompany.yourproject.services.FirebaseFileService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
public class ResourceController {
    @Autowired
    private FirebaseFileService firebaseFileService;
    
    @PostMapping("/api/v1/test")
    public ResponseEntity create(@RequestParam(name = "file") MultipartFile file) {
        try {
            String fileName = firebaseFileService.saveTest(file);
            // do whatever you want with that
        } catch (Exception e) {
        //  throw internal error;
        }
        return ResponseEntity.ok().build();
    }
}
  1. Создайте сервис для загрузки изображения в хранилище Firebase.
import com.google.auth.oauth2.GoogleCredentials;
import com.google.cloud.storage.Blob;
import com.google.cloud.storage.BlobId;
import com.google.cloud.storage.BlobInfo;
import com.google.cloud.storage.Bucket;
import com.google.cloud.storage.Storage;
import com.google.firebase.cloud.StorageClient;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.EventListener;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.UUID;
import com.google.cloud.storage.StorageOptions;
import java.util.HashMap;
import java.util.Map;

@Service
public class FirebaseFileService {

    private Storage storage;

    @EventListener
    public void init(ApplicationReadyEvent event) {
        try {
            ClassPathResource serviceAccount = new ClassPathResource("firebase.json");
            storage = StorageOptions.newBuilder().
                    setCredentials(GoogleCredentials.fromStream(serviceAccount.getInputStream())).
                    setProjectId("YOUR_PROJECT_ID").build().getService();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public String saveTest(MultipartFile file) throws IOException{
        String imageName = generateFileName(file.getOriginalFilename());
        Map<String, String> map = new HashMap<>();
        map.put("firebaseStorageDownloadTokens", imageName);
        BlobId blobId = BlobId.of("YOUR_BUCKET_NAME", imageName);
        BlobInfo blobInfo = BlobInfo.newBuilder(blobId)
                .setMetadata(map)
                .setContentType(file.getContentType())
                .build();
        storage.create(blobInfo, file.getInputStream());
        return imageName;
    }
    
    private String generateFileName(String originalFileName) {
        return UUID.randomUUID().toString() + "." + getExtension(originalFileName);
    }

    private String getExtension(String originalFileName) {
        return StringUtils.getFilenameExtension(originalFileName);
    }
}

Обратите внимание, что вам необходимо загрузить файл конфигурации Firebase и сохранить его как «firebase.json» в папке src/main/resources. https://support.google.com/firebase/answer/7015592?hl=ru

Также вам нужно добавить зависимость Maven:

<dependency>
    <groupId>com.google.firebase</groupId>
    <artifactId>firebase-admin</artifactId>
    <version>6.14.0</version>
</dependency>

какое имя ведра, когда вы используете ведро по умолчанию?

Parag Kadam 10.04.2021 15:37

Кроме того, я получаю java.lang.NoClassDefFoundError: com/google/common/io/BaseEncoding в методе init.

Parag Kadam 10.04.2021 16:08

Вы добавили зависимость Maven в файл pom.xml?

David Jesus 10.04.2021 16:50

Да, зависимость уже добавлена. Исключение на самом деле означает, что класс был найден во время компиляции, но каким-то образом не был найден во время выполнения.

Parag Kadam 10.04.2021 16:53

Посмотрите на FirebaseFileService импорт и сравните. У меня есть «konjunto-13c31.appspot.com» в качестве имени корзины, вы можете найти его в опции «Хранилище» в консоли вашего проекта Firebase.

David Jesus 10.04.2021 17:00

Все еще возникает та же проблема после использования того же импорта и правильного имени корзины. Интересно, это все еще работает для вас?

Parag Kadam 10.04.2021 17:22

Похоже, это работает, когда инструментом сборки является maven, и я использовал Gradle. Это настолько запутанно, что я не знаю, почему это происходит.

Parag Kadam 10.04.2021 18:20

Вы загрузили файл «firebase.json» и сохранили его в папке «ресурсы»? В настоящее время у меня есть эта конфигурация, работающая в двух проектах.

David Jesus 11.04.2021 07:38

Да, об этом позаботились.

Parag Kadam 11.04.2021 07:40

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