3.9.8.1. 上传文件
通过使用FileUpload和FileMultiUpload组件可以将用户计算机上的文件上传到存储中。本手册中的相应组件说明提供了用法示例。
参考 在 CUBA 应用程序中使用图片 指南,了解如何在应用程序中上传和显示图片。 |
FileUpload
组件也可在即用型 FileUploadDialog
窗口中使用,这个窗口设计用来加载文件至临时存储。
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 天的所有文件。