Vaadin我在上传文件之前触发了addSucceededListener

问题描述

早上好,社区。我是Java和Vaadin的新手。请向我解释为什么addSucceededListener()在下载文件之前(在加载页面时)被触发?

您可以在Vaadin论坛here上查看讨论。

只是一条鱼文本,它将省略编辑器以发布-_-

Lorem ipsum dolor坐着,安全奉献精英。 Nulla non finibus massa。 Maecenas ut metus坐在一个lucus facilisis。毛利人的猫科动物。 Curabitur vitaci tincidunt velit,congue矢状turpis。独联体的Duis sollicitudin。 Pellentesque quis justo sit amet dui tristiquevestibulum commodo et risus。暂停一个commodo lectus,一个hendrerit按摩。 Donec sagittis commodo purus,ut mollis risus ultricies id。 Curabitur lacinia mi vitae luctus tristique。紫茎泽兰和乌贼菌中的初生的Vestipulum ante ipsum primis; Prous at varius justo。震颤性三角洲迷晕,交流性昏迷。

@Route("")
public class UploadView extends VerticalLayout {
    @Autowired
    PictureRepository pictureRepository;

    @Autowired
    GoogleCloudAiAssistantRecognition googleCloudAiAssistantRecognition;

    public UploadView() {
        this.pictureRepository = pictureRepository;
        this.googleCloudAiAssistantRecognition = googleCloudAiAssistantRecognition;

        MenuBar menuBar = new MenuBar();
        menuBar.addThemeVariants(MenuBarVariant.LUMO_PRIMARY);

        MenuItem resultsItem = menuBar.addItem("Get Results");
        MenuItem tagItem = menuBar.addItem("Edit Tag");

        resultsItem.addClickListener(e -> UI.getCurrent().navigate("ai-result"));
        tagItem.addClickListener(e -> UI.getCurrent().navigate("edit-tag"));

        add(menuBar,new H1("Assistant recognition by Google Vision"));

        MemoryBuffer buffer = new MemoryBuffer();
        Upload upload = new Upload(buffer);
        upload.setAcceptedFileTypes("image/jpeg","image/png","image/gif");
        upload.setMaxFileSize(10485760);
        Div output = new Div();

        upload.addSucceededListener(event -> {
                InputStream inputStream = buffer.getInputStream();
                byte[] bytes = new byte[0];
                try {
                    bytes = IoUtils.toByteArray(inputStream);
                } catch (IOException e) {
                    e.printstacktrace();
                }

                add(new H1(event.getMIMEType()));
                Component component = createComponent(event.getMIMEType(),event.getFileName(),inputStream);
                showOutput(event.getFileName(),component,output);

                PictureModel pictureModel = new PictureModel(event.getFileName(),event.getMIMEType(),bytes);
                Long picId = pictureRepository.save(pictureModel).getId();

                List<TagModel> tags = null;
                try {
                    tags = googleCloudAiAssistantRecognition.detect(picId);
                } catch (Exception e) {
                    e.printstacktrace();
                }
                pictureModel.setTagModel(tags);
        });

        /*upload.getElement().addEventListener("upload-success",e -> {
            System.out.println(e.getEventData());
        });*/

        add(upload,output);
    }

解决方法

我怀疑您可能有误会。它添加了成功侦听器,但是侦听器代码尚未执行。

您似乎还使用了bytes变量,该变量始终为空,因为您读取了一个空缓冲区(在successedListener之外)的inputStream。

请尝试使用此代码,然后,如果您的“问题”仍然存在,请尝试重新制定问题。

public UploadView() throws IOException {
    add(new H1("Assistant recognition by Google Vision"));

    MemoryBuffer buffer = new MemoryBuffer();
    Upload upload = new Upload(buffer);
    upload.setAcceptedFileTypes("image/jpeg","image/png","image/gif");
    upload.setMaxFileSize(10485760);
    Div output = new Div();

    // move this INTO the succeededListener,because otherwise the buffer is empty
    //InputStream inputStream = buffer.getInputStream();
    //byte[] bytes = IOUtils.toByteArray(inputStream);

    upload.addSucceededListener(event -> {
        InputStream inputStream = buffer.getInputStream();
        byte[] bytes = IOUtils.toByteArray(inputStream);

        add(new H1(event.getMIMEType()));
        Component component = createComponent(event.getMIMEType(),event.getFileName(),inputStream);
        showOutput(event.getFileName(),component,output);

        PictureModel pictureModel = new PictureModel(event.getFileName(),event.getMIMEType(),bytes);
        Long picId = pictureRepository.save(pictureModel).getId();

        List<TagModel> tags = null;
        try {
            tags = googleCloudAiAssistantRecognition.detect(picId);
        } catch (Exception e) {
            e.printStackTrace();
        }
        pictureModel.setTagModel(tags);
        pictureRepository.save(pictureModel);
    });

    add(upload,output);
}