3.9.8.1. 上传文件

通过使用FileUploadFileMultiUpload组件可以将用户计算机上的文件上传到存储中。本手册中的相应组件说明提供了用法示例。

参考 在 CUBA 应用程序中使用图片 指南,了解如何在应用程序中上传和显示图片。

FileUpload 组件也可在即用型 FileUploadDialog 窗口中使用,这个窗口设计用来加载文件至临时存储。

FileUploadDialog 对话框提供将文件上传到临时存储的基本功能。窗口包含了上传按钮和投放区域,可以支持从浏览器外拖拽文件至投放区进行上传。

gui fileUploadDialog

此对话框是使用旧版的界面 API 实现,可以按照下面的方式使用:

@Inject
private Screens screens;

@Inject
private FileUploadingAPI fileUploadingAPI;

@Inject
private DataManager dataManager;

@Subscribe("showUploadDialogBtn")
protected void onShowUploadDialogBtnClick(Button.ClickEvent event) {
    FileUploadDialog dialog = (FileUploadDialog) screens.create("fileUploadDialog", OpenMode.DIALOG);
    dialog.addCloseWithCommitListener(() -> {
        UUID fileId = dialog.getFileId();
        String fileName = dialog.getFileName();

        File file = fileUploadingAPI.getFile(fileId); (1)

        FileDescriptor fileDescriptor = fileUploadingAPI.getFileDescriptor(fileId, fileName); (2)
        try {
            fileUploadingAPI.putFileIntoStorage(fileId, fileDescriptor); (3)
            dataManager.commit(fileDescriptor); (4)
        } catch (FileStorageException e) {
            throw new RuntimeException(e);
        }
    });
    screens.show(dialog);
}
1 - 获取 java.io.File 对象,此对象指向文件在 Web 客户端文件系统的位置。一般情况下,文件上传后回放到文件存储中,如果需要处理该文件,则需要获取 File 对象。
2 - 创建一个 FileDescriptor 实体。
3 - 上传文件至中间层的文件存储。
4 - 保存 FileDescriptor 实体。

在上传成功后,对话框使用 COMMIT_ACTION_ID 关闭。在 CloseWithCommitListener 监听器中,可以用 getFileId()getFileName() 方法获取上传文件的 UUID 和名称。然后可以获取文件本身或者创建 FileDescriptor 对象并上传文件到文件存储,也可以实现其它的逻辑。

临时客户端级别的存储(FileUploadingAPI)将临时文件存在由 cuba.tempDir 应用程序属性定义的文件夹中。临时文件会在下面的情况自动删除:

  • 如果 FileUploadField 使用 IMMEDIATE 模式

  • 如果您使用 FileUploadingAPI.putFileIntoStorage(UUID, FileDescriptor) 方法。

否则,需要用 FileUploadingAPI.deleteFile(UUID) 方法删除临时文件。

出现任何失败的情况,临时文件都会保留在上面提到的文件夹中。cuba-web-spring.xml 文件定义了定时任务,调用 cuba_FileUploading bean 的 clearTempDirectory() 方法定时清理。默认情况下,会在周二、周四、周六的晚上 0 点执行,删除保存时间大于 2 天的所有文件。