如何使用Java上传图像/文件到Firebase存储?

5

我正在处理一个功能,需要使用Java上传图像/文件到Firebase Storage,并将其作为API公开。我已经在Angular 4 TypeScript中实现了这个功能。但是现在我需要将此方法作为Java Rest API,以便我的同事也可以使用相同的方法而无需编写新的方法。那么是否有API或方法可将图片写入Firebase Storage?


你目前尝试了什么? - mrkernelpanic
1
我尝试过在谷歌上搜索,但是我只能找到Java SDK的Firebase存储示例。 - Pradeep Anand
4个回答

4

试试这个:

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

2
如果您正在使用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();
    }
}

创建一个服务来将图像上传到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>

1
如果Java项目在受信任的环境中运行(例如开发机器、您控制的服务器或Cloud Functions),他们可以使用Firebase Admin SDK访问Cloud Storage。
请参阅Firebase Admin SDK文档以了解如何入门,然后查看Java客户端的Google Cloud Storage文档以获取更多信息。具体请查看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));

谢谢Frank!!我会看一下的。 - Pradeep Anand
FileInputStream serviceAccount = new FileInputStream("xxxx.json"); FirebaseOptions options = new FirebaseOptions.Builder() .setCredentials(GoogleCredentials.fromStream(serviceAccount)) .setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/") .build(); FirebaseApp.initializeApp(options);我尝试使用下面的代码片段来初始化Firebase,但是我得到了一个错误,提示在Builder().setCredentials中方法未定义。我在Maven中使用了firebase-admin 6.5.0依赖项。提前致谢。 - Pradeep Anand

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接