1

我正在使用带有 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[] 时似乎出现了问题

任何知道可以帮助我的人吗?

4

0 回答 0