【问题标题】:Vaadin. addSucceededListener() is triggered before I upload the file瓦丁。在我上传文件之前触发 addSucceededListener()
【发布时间】:2021-02-05 01:25:21
【问题描述】:

晚安,社区。我尤其是 Java 和 Vaadin 的新手。请向我解释为什么 addSucceededListener() 比我下载文件更早(加载页面时)触发?

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

只是一个鱼文本,会省略编辑出版 -_-

Lorem ipsum dolor sit amet,consectetur adipiscing elit。 Nulla非finibus massa。 Maecenas ut metus 坐在 amet odio luctus facilisis。 Mauris vulputate enim nec nibh mollis,在 tincidunt orci posuere。 Curabitur vitae tincidunt velit, congue sagittis turpis。 Duis sollicitudin in metus non pulvinar。 Pellentesque quis justo sit amet dui tristique vestibulum commodo et risus。 Suspendisse a commodo lectus, a hendrerit massa。 Donec sagittis commodo purus,ut mollis risus ultricies id。 Curabitur lacinia mi vitae luctus tristique。 Faucibus orci luctus et ultrices posuere cubilia curae 中的前庭前庭; Proin 在 varius justo。 Vestibulum posuere tristique metus, ac commodo elit consectetur id。

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

【问题讨论】:

    标签: java user-interface vaadin


    【解决方案1】:

    我怀疑你可能有误解。它添加了successed-listener,但还没有执行listener-code。

    您似乎还使用了始终为空的bytes 变量,因为您读取了空缓冲区(在succededListener 之外)的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);
    }
    

    【讨论】:

    • 问题是很多Listener监听器在原理上是不起作用的,都是在文件加载之前执行的,甚至addFinishedListener()。我可以看到我并不是唯一一个遇到这个问题的人,到目前为止,我找到了一种解决方法 upload.getElement().addEventListener("upload-success" ...我还注意到最初一切正常,直到我开始添加新的Maven 依赖(恐怕我不能说我什么时候没有立即使用 git)。关于这个问题的链接 - github.com/vaadin/vaadin-upload-flow/issues/134
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 2014-02-10
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多