我正在使用带有 SpringBoot 的 Vaadin 14。我正在编写一些将图像上传到谷歌存储桶的软件。上传本身可以正常工作,但到达存储桶的文件不再是图像。几周前我写了代码,然后它仍然可以工作,没有任何改变,但现在它不再工作了。我正在使用 InputStream 将它上传到存储桶,我从 Vaadin 上传组件获取流。这是代码
从 vaadin 组件上传到 memoryBuffer
public CreateKidView(@Autowired KidService kidService) {
this.kidService = kidService;
TextField kidFirstName = new TextField("Voornaam");
TextField kidLastName = new TextField("Achternaam");
DatePicker kidBirthDate = new DatePicker("GeboorteDatum");
TextField kidMedication = new TextField("Medicatie");
MemoryBuffer memoryBuffer = new MemoryBuffer();
Upload imageUpload = new Upload(memoryBuffer);
Button button = new Button("Kind toevoegen",
buttonClickEvent -> {
saveKidAndNavigate(kidFirstName.getValue(), kidLastName.getValue(), kidBirthDate.getValue(),
kidMedication.getValue(), memoryBuffer.getInputStream());
}
);
button.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
addClassName("centered-content");
add(kidFirstName, kidLastName, kidBirthDate, kidMedication, imageUpload, button);
}
然后我通过其他几个类传递输入流,直到到达这里我才对它做任何事情:我设置 contentType: "image/jpeg" 并将其传递给我的 bucketService 以上传输入流。
public void addImageToPerson(Person person, String imageName, InputStream inputStream) {
String image = bucketService.uploadFileToBucket(imageName, "image/jpeg", inputStream);
......
}
@Slf4j
@Service
public class BucketService {
private final String companyName;
private final Storage storage;
@Autowired
public BucketService(@Value("${company.name}")String companyName, @Value("${gc.project.name}")String gcProjectName) {
this.companyName = companyName;
storage = StorageOptions.newBuilder().setProjectId(gcProjectName).build().getService();
}
public String uploadFileToBucket(String fileName, String contentType, InputStream inputStream) {
try {
BlobId blobId = BlobId.of(companyName, fileName);
BlobInfo blobInfo = BlobInfo.newBuilder(blobId).build();
storage.create(blobInfo, IOUtils.toByteArray(inputStream));
return fileName;
} catch (StorageException | IOException e) {
log.error("could not save image: {}", e.getMessage());
return "oops";
}
}
}
它曾经完美地工作,从那以后没有任何代码发生变化,所以我猜测谷歌发生了一些变化。我想知道你们中是否有人有我可以尝试或知道的事情发生了变化。
我还编写了一些代码来测试输入流本身是否有效,我在屏幕上显示从内存中获取的图像:
提前致谢 :)
- 编辑
经过更多调查后,我发现输入流产生的 byte[] 与文件本身产生的 byteArray 不同:
byte[] bytes = IOUtils.toByteArray(inputStream);
byte[] content = Files.readAllBytes(Paths.get("/Users/BartDuwez/Desktop/avatars-000338105915-u01ky6-t500x500.jpg"));
storage.create(blobInfo, content);
有 1 个字节的差异:第一个字节。
字节:-40、-1、-30、...
内容:-1, -40, -1, -30, ...
我不知道这是如何工作的。要清楚 byte[] 内容在存储桶中正确显示图像!
当我检查 inputStream 中的 buf 时,有一个字节 [],该字节 [] 与内容字节 [] 的内部相同
如果我在调试器中这样做:
storage.create(blobInfo, ((ByteArrayInputStream) inputStream).buf);
一个文件被上传并且它可以工作:但是 .buf 受到保护,所以我不能在我的代码中使用它。这使得在将输入流转换为 byte[] 时似乎出现了问题
任何知道可以帮助我的人吗?