Java 如何阅读与Vaadin';什么是上传方式?

Java 如何阅读与Vaadin';什么是上传方式?,java,vaadin,Java,Vaadin,我已经创建了一个上传按钮,或者使用Vaadin 14创建了上传按钮。工作起来很有魅力。完美的但是我如何访问我上传的图像呢?我试着阅读Vaadin网页上的教程,但它们只显示了我在下面发布的示例。而不是如何访问图片。我想得到矩阵形式的所有像素,并将它们全部转换为0..255灰度 问题: 当我用这个代码上传图片时,你知道用什么方法来获取图片吗 @Data public class PictureUpload { private Upload upload; public Pictu

我已经创建了一个上传按钮,或者使用Vaadin 14创建了上传按钮。工作起来很有魅力。完美的但是我如何访问我上传的图像呢?我试着阅读Vaadin网页上的教程,但它们只显示了我在下面发布的示例。而不是如何访问图片。我想得到矩阵形式的所有像素,并将它们全部转换为0..255灰度

问题:

当我用这个代码上传图片时,你知道用什么方法来获取图片吗

@Data
public class PictureUpload {

    private Upload upload;

    public PictureUpload() {
        // Add picture uploader
        upload = new Upload();
        addPictureUploader();
    }

    private void addPictureUploader() {
        Div output = new Div();

        MultiFileMemoryBuffer buffer = new MultiFileMemoryBuffer();
        upload.setReceiver(buffer);
        upload.setAcceptedFileTypes("image/jpeg", "image/png", "image/gif");

        upload.addSucceededListener(event -> {
            Component component = createComponent(event.getMIMEType(), event.getFileName(), buffer.getInputStream(event.getFileName()));
            showOutput(event.getFileName(), component, output);
        });

    }

    private Component createComponent(String mimeType, String fileName, InputStream stream) {
        if (mimeType.startsWith("text")) {
          return createTextComponent(stream);
        } else if (mimeType.startsWith("image")) {
            Image image = new Image();
            try {

                byte[] bytes = IOUtils.toByteArray(stream);
                image.getElement().setAttribute("src", new StreamResource(fileName, () -> new ByteArrayInputStream(bytes)));
                try (ImageInputStream in = ImageIO.createImageInputStream(new ByteArrayInputStream(bytes))) {
                    final Iterator<ImageReader> readers = ImageIO.getImageReaders(in);
                    if (readers.hasNext()) {
                        ImageReader reader = readers.next();
                        try {
                            reader.setInput(in);
                            image.setWidth(reader.getWidth(0) + "px");
                            image.setHeight(reader.getHeight(0) + "px");
                        } finally {
                            reader.dispose();
                        }
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

            return image;
        }
        Div content = new Div();
        String text = String.format("Mime type: '%s'\nSHA-256 hash: '%s'", mimeType, MessageDigestUtil.sha256(stream.toString()));
        content.setText(text);
        return content;

    }

  private Component createTextComponent(InputStream stream) {
    String text;
    try {
        text = IOUtils.toString(stream, StandardCharsets.UTF_8);
    } catch (IOException e) {
        text = "exception reading stream";
    }
    return new Text(text);
  }

  private void showOutput(String text, Component content, HasComponents outputContainer) {
        HtmlComponent p = new HtmlComponent(Tag.P);
        p.getElement().setText(text);
        outputContainer.add(p);
        outputContainer.add(content);
    }
}
其中,我使用此
main视图插入
subjectCounterExportButtonUploaders
。我上传图片时看不到它

@Route("")
@Viewport("width=device-width, minimum-scale=1, initial-scale=1, user-scalable=yes, viewport-fit=cover")
@PreserveOnRefresh
public class MainView extends AppLayout {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public MainView() {

        // Get the components
        VerticalLayout buildPredictValidateTemplate = new BuildPredictValidateTemplate().getBuildButtonPredictButtonValidateButtonTextArea();
        VerticalLayout subjectCounterExportButtonUpload = new LoadExportTemplate().getSubjectCounterExportButtonUploaders();


        // Create logo and drawer
        Image barImage = new Image("img/barImage.png", "Fisherfaces Logo");
        barImage.setHeight("55px");
        addToNavbar(new DrawerToggle(), barImage);

        // Create tabs and add listeners to them
        Tab buildPredictValidate = new Tab("Build & Predict & Validate");
        buildPredictValidate.getElement().addEventListener("click", e -> {
            getContent().getChildren().forEach(component -> {
                boolean visible = component.equals(buildPredictValidateTemplate);
                component.setVisible(visible);
            });

        });
        Tab loadExport = new Tab("Load & Export");
        loadExport.getElement().addEventListener("click", e -> {
            // Walk around from the bug
            getContent().getChildren().forEach(component -> {
                boolean visible = component.equals(subjectCounterExportButtonUpload);
                component.setVisible(visible);
            });
        });

        // Set the contents
        setContent(new Div(buildPredictValidateTemplate, subjectCounterExportButtonUpload));
        subjectCounterExportButtonUpload.setVisible(false);

        // Add them and place them as vertical
        Tabs tabs = new Tabs(buildPredictValidate, loadExport);
        tabs.setOrientation(Tabs.Orientation.VERTICAL);
        addToDrawer(tabs);

    }
}
@Route(value = UploadView.ROUTE)
@PageTitle(UploadView.TITLE)
public class UploadView extends AppLayout{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    public static final String ROUTE = "upload";
    public static final String TITLE = "Upload";

    public UploadView() {


        PictureUpload pictureUpload = new PictureUpload();
        VerticalLayout vl = new VerticalLayout();
        vl.add(pictureUpload.getUpload(),pictureUpload.getOutput());

        setContent(vl);
    }
}
但这个例子是有效的。在这里我可以看到图片时,我上传它

@Route("")
@Viewport("width=device-width, minimum-scale=1, initial-scale=1, user-scalable=yes, viewport-fit=cover")
@PreserveOnRefresh
public class MainView extends AppLayout {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public MainView() {

        // Get the components
        VerticalLayout buildPredictValidateTemplate = new BuildPredictValidateTemplate().getBuildButtonPredictButtonValidateButtonTextArea();
        VerticalLayout subjectCounterExportButtonUpload = new LoadExportTemplate().getSubjectCounterExportButtonUploaders();


        // Create logo and drawer
        Image barImage = new Image("img/barImage.png", "Fisherfaces Logo");
        barImage.setHeight("55px");
        addToNavbar(new DrawerToggle(), barImage);

        // Create tabs and add listeners to them
        Tab buildPredictValidate = new Tab("Build & Predict & Validate");
        buildPredictValidate.getElement().addEventListener("click", e -> {
            getContent().getChildren().forEach(component -> {
                boolean visible = component.equals(buildPredictValidateTemplate);
                component.setVisible(visible);
            });

        });
        Tab loadExport = new Tab("Load & Export");
        loadExport.getElement().addEventListener("click", e -> {
            // Walk around from the bug
            getContent().getChildren().forEach(component -> {
                boolean visible = component.equals(subjectCounterExportButtonUpload);
                component.setVisible(visible);
            });
        });

        // Set the contents
        setContent(new Div(buildPredictValidateTemplate, subjectCounterExportButtonUpload));
        subjectCounterExportButtonUpload.setVisible(false);

        // Add them and place them as vertical
        Tabs tabs = new Tabs(buildPredictValidate, loadExport);
        tabs.setOrientation(Tabs.Orientation.VERTICAL);
        addToDrawer(tabs);

    }
}
@Route(value = UploadView.ROUTE)
@PageTitle(UploadView.TITLE)
public class UploadView extends AppLayout{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    public static final String ROUTE = "upload";
    public static final String TITLE = "Upload";

    public UploadView() {


        PictureUpload pictureUpload = new PictureUpload();
        VerticalLayout vl = new VerticalLayout();
        vl.add(pictureUpload.getUpload(),pictureUpload.getOutput());

        setContent(vl);
    }
}

你知道为什么吗?

在你的评论中,你澄清了你想要的只是在上传后获得图像的
字节[]
。下面是你如何做到这一点的

变量1:
MultiFileMemoryBuffer

    MultiFileMemoryBuffer buffer = new MultiFileMemoryBuffer();
    upload.setReceiver(buffer);
    upload.setAcceptedFileTypes("image/jpeg", "image/png", "image/gif");

    upload.addSucceededListener(event -> {
        byte[] imageBytes = IOUtils.toByteArray(buffer.getInputStream(event.getFileName()));
    });
变体2:成为您自己的
接收器
接口

public class UploadView implements Receiver {

    private FastByteArrayOutputStream outputStream;
    private Upload upload;
    private Button actualUploadButton;

    public UploadView(){
        upload = new Upload(this);
        upload.setAcceptedFileTypes("image/jpeg", "image/png", "image/gif");
        upload.addSucceededListener(event -> {
            // uploaded file is now in outputStream
            byte[] newImageBytes = outputStream.toByteArray();

            Notification.show("We have now got the uploaded images bytearray!");
        });
        upload.setMaxFiles(10);
        actualUploadButton = new Button(getTranslation("upload-image"), VaadinIcon.UPLOAD.create());
        actualUploadButton.setWidth("100%");
        upload.setUploadButton(actualUploadButton);
        add(upload);
    }

    @Override
    public OutputStream receiveUpload(String s, String s1) {
        return outputStream = new FastByteArrayOutputStream();
    }
}

我不确定我是否正确理解了这个问题。您是否在询问如何在succeededListener中找到作为图片的bytearray(
byte[]
)?或者你在问如何使用bytearray处理/转换像素值?这里有一个图片上传示例->@kscherrer是的。我想从输出中访问字节数组。