【问题标题】:How To upload Images/Files to Firebase storage in Java?如何在 Java 中将图像/文件上传到 Firebase 存储?
【发布时间】:2019-03-26 11:09:04
【问题描述】:

我正在开发一个功能,我需要使用 java 将图像/文件上传到 firebase 存储并将其公开为 API。我已经在 angular 4 typescript 中实现了这个功能。但是现在我需要这个方法作为 Java Rest API,这样我的同伴也可以使用相同的方法而不是编写新的方法。那么是否有任何 API 或方法可以将图像写入 firebase 存储?

【问题讨论】:

  • 到目前为止你有什么尝试?
  • 我尝试用谷歌搜索它,但我只能找到 Java SDK 的 firebase 存储示例。

标签: java rest firebase firebase-storage


【解决方案1】:

如果 Java 项目在受信任的环境中运行(例如他们的开发机器、您控制的服务器或 Cloud Functions),他们可以使用 Firebase Admin SDK 访问 Cloud Storage。

请参阅Firebase Admin SDK documentation 了解如何开始,然后参阅Google Cloud Storage documentation for Java clients 了解更多信息。具体看看sample of uploading a file in Java

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));

【讨论】:

  • 谢谢弗兰克!会看看的。
  • FileInputStream serviceAccount = new FileInputStream("xxxx.json"); FirebaseOptions options = new FirebaseOptions.Builder() .setCredentials(GoogleCredentials.fromStream(serviceAccount)) .setDatabaseUrl("https://.firebaseio.com/") .build(); FirebaseApp.initializeApp(options);我尝试了下面的 sn-p 来初始化 firebase,但是我收到错误,因为 Builder().setCredentials 中的方法未定义。我在 maven 中使用了 firebase-admin 6.5.0 依赖项。提前致谢
【解决方案2】:

试试这个:

FirebaseOptions options = FirebaseOptions.builder()
                    .setCredentials(credential)
                    .setDatabaseUrl(projectUrl)
                    .setStorageBucket("YOUR BUCKET LINK")
                    .build();

    FirebaseApp fireApp = FirebaseApp.initializeApp(options);

    StorageClient storageClient = StorageClient.getInstance(fireApp);
            InputStream testFile = new FileInputStream("YOUR FILE PATH");
            String blobString = "NEW_FOLDER/" + "FILE_NAME.EXT";        

    storageClient.bucket().create(blobString, testFile , Bucket.BlobWriteOption.userProject("YOUR PROJECT ID"));

【讨论】:

    【解决方案3】:
    String blobString = DIR + fileIdWithExtension;
    Blob blob = storageClient.bucket().create(blobString, file.getInputStream(), Bucket.BlobWriteOption.userProject(PROJECT_ID));
    

    但请记住,您应该初始化 firebase。例如

       private FirebaseApp initFirebase() {
            FileInputStream serviceAccount;
            try {
                serviceAccount = new FileInputStream(fileUploadPath);
            } catch (FileNotFoundException e) {
                throw new FileStorageException(ErrorMessage.FILE_NOT_FOUND + "firebaseConfig.json");
            }
            FirebaseOptions options;
            try {
                options = new FirebaseOptions.Builder()
                        .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                        .setStorageBucket(BUCKET_NAME)
                        .build();
            } catch (IOException e) {
                e.printStackTrace();
                throw new FailedToSetCredentialsException(ErrorMessage.COULD_NOT_SET_CREDENTIALS);
            }
    
            return FirebaseApp.initializeApp(options);
        }
    
    

    【讨论】:

      【解决方案4】:

      如果你使用的是 Spring Boot,你可以试试这个:

      1. 创建一个类以在您的 API 中将其公开为 Web 服务:
      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 存储。
      @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=en

      另外你需要添加 Maven 依赖:

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

      【讨论】:

        猜你喜欢
        • 2021-07-03
        • 2017-03-27
        • 2020-04-30
        • 2017-09-25
        • 2021-02-20
        • 2019-07-24
        相关资源
        最近更新 更多