首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何清除上传组件的MemoryBuffer

如何清除上传组件的MemoryBuffer
EN

Stack Overflow用户
提问于 2022-04-27 11:31:52
回答 1查看 42关注 0票数 0

这里的第一个定时器:我有一个上传组件,它拍摄一个图像并在一个布局中显示它。保存按钮触发将映像保存到DB,并且工作正常。

问题是:对于下一条记录,在tr严谨保存方法中,如果没有向upload组件添加任何图像,那么前面的图像将再次保存。(我猜内存缓冲区仍然保存着该图像)。因此,我的问题是,如何清除下一个记录的内存缓冲区。另外,我想知道是否可以检索图像容器中显示的图像,以便将其保存到image变量中。

代码语言:javascript
复制
代码语言:javascript
复制
public class EmployeeForm extends FormLayout {
代码语言:javascript
复制
    Image image;
代码语言:javascript
复制
    Button save = new Button("Save");
代码语言:javascript
复制
    Button delete = new Button("Delete");
代码语言:javascript
复制
    Button close = new Button("Close");
代码语言:javascript
复制
    MemoryBuffer buffer= new MemoryBuffer();
代码语言:javascript
复制
    Upload upload= new Upload(buffer); 
代码语言:javascript
复制
    VerticalLayout imageContainer=new VerticalLayout();
代码语言:javascript
复制
    BufferedImage inputImageoriginal=null;
代码语言:javascript
复制
    public EmployeeForm(List<Office> offices, List<Cell> cells, DbService dbservice) {
代码语言:javascript
复制
        binder.bindInstanceFields(this);
代码语言:javascript
复制
        office.setItems(dbservice.findOfficesBydistrict());
代码语言:javascript
复制
        cell.setItems(dbservice.findCellsBydistrict());
代码语言:javascript
复制
        office.setItemLabelGenerator(Office::getOfficeName);
代码语言:javascript
复制
        cell.setItemLabelGenerator(Cell::getCellName);
代码语言:javascript
复制
        add(firstName, lastName, designation, office, cell, createUpload(), createButtonsLayout(), imageContainer);
代码语言:javascript
复制
    }
代码语言:javascript
复制
    private Component createUpload() {
代码语言:javascript
复制
        upload.setMaxFiles(1);
代码语言:javascript
复制
        upload.setMaxFileSize(100000);
代码语言:javascript
复制
        upload.setUploadButton(new Button ("Upload Photo"));
代码语言:javascript
复制
        upload.setDropLabel(new Label("Drop Photo"));
代码语言:javascript
复制
        upload.setAcceptedFileTypes("image/tiff", "image/jpeg", "image/jpg");
代码语言:javascript
复制
        upload.addFileRejectedListener(e -> notify.show("Invalid File: Please select only image files less than 100kb",3000, Position.TOP_END));
代码语言:javascript
复制
        upload.addSucceededListener(event -> showPicture());
代码语言:javascript
复制
        return upload;
代码语言:javascript
复制
    }
代码语言:javascript
复制
    public void showPicture() {
代码语言:javascript
复制
        try {
代码语言:javascript
复制
            if (imageContainer != null) {
代码语言:javascript
复制
                remove(imageContainer);
代码语言:javascript
复制
            }
代码语言:javascript
复制
            StreamResource resource = new StreamResource("inputimage",
代码语言:javascript
复制
                    () -> new ByteArrayInputStream(getImageAsByteArray()));
代码语言:javascript
复制
            image = new Image(resource, "No Photo to display");
代码语言:javascript
复制
            imageContainer = new VerticalLayout();
代码语言:javascript
复制
            imageContainer.setWidth("200px");
代码语言:javascript
复制
            imageContainer.setHeight("200px");
代码语言:javascript
复制
            imageContainer.getStyle().set("overflow-x", "auto");
代码语言:javascript
复制
            imageContainer.add(image);
代码语言:javascript
复制
            add(imageContainer);
代码语言:javascript
复制
            //imageContainer.get
代码语言:javascript
复制
        } catch (Exception e) {
代码语言:javascript
复制
            e.printStackTrace();
代码语言:javascript
复制
            notify.show("Error" + e);
代码语言:javascript
复制
        }
代码语言:javascript
复制
    }
代码语言:javascript
复制
    public void clearBuffer() {
代码语言:javascript
复制
        try {
代码语言:javascript
复制
            upload.clearFileList();
代码语言:javascript
复制
        } catch (Exception e) {
代码语言:javascript
复制
            // TODO: handle exception
代码语言:javascript
复制
        }
代码语言:javascript
复制
    }
代码语言:javascript
复制
    private byte[] getImageAsByteArray() {
代码语言:javascript
复制
        try {
代码语言:javascript
复制
            inputImageoriginal= ImageIO.read(buffer.getInputStream());
代码语言:javascript
复制
            if (inputImageoriginal == null) {
代码语言:javascript
复制
                return null;
代码语言:javascript
复制
            } else {
代码语言:javascript
复制
                BufferedImage inputImage = resizeImage(inputImageoriginal);
代码语言:javascript
复制
                ByteArrayOutputStream pngContent = new ByteArrayOutputStream();
代码语言:javascript
复制
                ImageIO.write(inputImage, "jpg", pngContent);
代码语言:javascript
复制
                InputStream is = new ByteArrayInputStream(pngContent.toByteArray());
代码语言:javascript
复制
                return IOUtils.toByteArray(is);
代码语言:javascript
复制
            }
代码语言:javascript
复制
        } catch (IOException e) {
代码语言:javascript
复制
            e.printStackTrace();
代码语言:javascript
复制
            return null;
代码语言:javascript
复制
        }
代码语言:javascript
复制
    }
代码语言:javascript
复制
    BufferedImage resizeImage(BufferedImage originalImage) throws IOException {
代码语言:javascript
复制
        BufferedImage resizedImage = new BufferedImage(150, 150, BufferedImage.TYPE_INT_RGB);
代码语言:javascript
复制
        Graphics2D graphics2D = resizedImage.createGraphics();
代码语言:javascript
复制
        graphics2D.drawImage(originalImage, 0, 0, 150, 150, null);
代码语言:javascript
复制
        graphics2D.dispose();
代码语言:javascript
复制
        return resizedImage;
代码语言:javascript
复制
    }
代码语言:javascript
复制
    private Component createButtonsLayout() {
代码语言:javascript
复制
        // TODO Auto-generated method stub
代码语言:javascript
复制
        save.setWidthFull();
代码语言:javascript
复制
        delete.setWidthFull();
代码语言:javascript
复制
        close.setWidthFull();
代码语言:javascript
复制
        save.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
代码语言:javascript
复制
        save.addClickShortcut(Key.ENTER);
代码语言:javascript
复制
        save.addClickListener(event -> validatandSave());
代码语言:javascript
复制
        delete.addClickListener(event -> fireEvent(new DeleteEvent(this, employee)));
代码语言:javascript
复制
        close.addClickListener(event -> fireEvent(new CloseEvent(this)));
代码语言:javascript
复制
        return new HorizontalLayout(save, delete, close);
代码语言:javascript
复制
    }
代码语言:javascript
复制
    private void validatandSave() {
代码语言:javascript
复制
        try {
代码语言:javascript
复制
            binder.writeBean(employee);
代码语言:javascript
复制
            if (getImageAsByteArray() != null) {
代码语言:javascript
复制
                employee.setPicture(getImageAsByteArray());
代码语言:javascript
复制
            }
代码语言:javascript
复制
            fireEvent(new SaveEvent(this, employee));
代码语言:javascript
复制
        } catch (ValidationException e) {
代码语言:javascript
复制
            // TODO Auto-generated catch block
代码语言:javascript
复制
            Notification notification = Notification.show("Please Enter All Required Fields", 3000,
代码语言:javascript
复制
                    Position.TOP_CENTER);
代码语言:javascript
复制
        }
代码语言:javascript
复制
    }
代码语言:javascript
复制
    public void setEmployee(Employee employee) {
代码语言:javascript
复制
        this.employee = employee;
代码语言:javascript
复制
        binder.readBean(employee);
代码语言:javascript
复制
    }
代码语言:javascript
复制
///Operation Save/Delete Events
代码语言:javascript
复制
    public static abstract class EmployeeFormEvent extends ComponentEvent<EmployeeForm> {
代码语言:javascript
复制
        private Employee employee;
代码语言:javascript
复制
        protected EmployeeFormEvent(EmployeeForm source, Employee employee) {
代码语言:javascript
复制
            super(source, false);
代码语言:javascript
复制
            this.employee = employee;
代码语言:javascript
复制
        }
代码语言:javascript
复制
        public Employee getEmployee() {
代码语言:javascript
复制
            return employee;
代码语言:javascript
复制
        }
代码语言:javascript
复制
    }
代码语言:javascript
复制
    public static class SaveEvent extends EmployeeFormEvent {
代码语言:javascript
复制
        SaveEvent(EmployeeForm source, Employee employee) {
代码语言:javascript
复制
            super(source, employee);
代码语言:javascript
复制
        }
代码语言:javascript
复制
    }
代码语言:javascript
复制
    public static class DeleteEvent extends EmployeeFormEvent {
代码语言:javascript
复制
        DeleteEvent(EmployeeForm source, Employee employee) {
代码语言:javascript
复制
            super(source, employee);
代码语言:javascript
复制
        }
代码语言:javascript
复制
    }
代码语言:javascript
复制
    public static class CloseEvent extends EmployeeFormEvent {
代码语言:javascript
复制
        CloseEvent(EmployeeForm source) {
代码语言:javascript
复制
            super(source, null);
代码语言:javascript
复制
        }
代码语言:javascript
复制
    }
代码语言:javascript
复制
    public <T extends ComponentEvent<?>> Registration addListener(Class<T> eventType,
代码语言:javascript
复制
            ComponentEventListener<T> listener) {
代码语言:javascript
复制
        return getEventBus().addListener(eventType, listener);
代码语言:javascript
复制
    }
代码语言:javascript
复制
    public void addImage(Image image2) {
代码语言:javascript
复制
        // TODO Auto-generated method stub
代码语言:javascript
复制
        // remove(imageContainer);
代码语言:javascript
复制
        if(imageContainer!=null) {
代码语言:javascript
复制
            imageContainer.removeAll();
代码语言:javascript
复制
        }
代码语言:javascript
复制
        imageContainer.add(image2);
代码语言:javascript
复制
        //add(imageContainer);
代码语言:javascript
复制
    }
代码语言:javascript
复制
}
代码语言:javascript
复制
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-27 12:08:50

查看MemoryBuffer的实现,您必须丢弃它并设置一个新的,例如在clearBuffer()方法中。

代码语言:javascript
复制
buffer = new MemoryBuffer();
upload.setReceiver(buffer);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72027970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档