java - Java Spring Boot 中的 Firebase 上传
问题描述
我正在尝试将文件上传到 Java Spring Boot 中的 Firebase 存储。我在网上查看了 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
解决方案
你可以试试这个:
- 创建一个类以在您的 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 存储。
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 配置文件并将其存储为 src/main/resources 文件夹下的“firebase.json”。 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>
推荐阅读
- c++ - 调试分段错误。需要帮助
- php - 如何在 PHP 中捕获嵌套在数组中的值?
- neo4j - Neo4j/Cypher - LIMIT 使查询运行得更快,尽管返回的结果更少
- c# - 如何将特定 URL 重定向到 ASP.NET 中的另一个 URL?
- encryption - 如何为 AES 加密生成随机密钥?
- php - PHP mysqli 准备查询失败(删除)
- python - 如何将从文件中读取的日期字符串转换为日期时间日期对象?
- jsp - how to insert both drop down values and text field values in to cart
- arrays - 如何编写 if exists 语句块以检查是否已使用名称数组安装了 Powershell 模块
- c# - 如何将字符串复制到剪贴板,同时在 Xamarin Forms 中保留其格式?