fileStorageUploadField 文件存储上传
基本用法
这个组件可以包含标题、已上传文件的链接和一个上传按钮。当点击上传按钮的时候,会弹出标准的文件选择器,用户可以在这里选择需要上传的文件。
fileStorageUploadField 既可以 绑定实体属性,也可以不绑定数据。
下面的示例我们展示在没有数据绑定的情况下使用组件。可以用来直接处理上传的文件,而无需将其与任何 Jmix 实体关联。
<fileStorageUploadField id="fileRefField"
acceptedFileTypes=".xlsx, .xls"
fileStoragePutMode="MANUAL"
fileNameVisible="true"/>
可以直接在 FileUploadSucceededEvent 事件中处理上传的文件。
|
如需以字节数组的格式在实体属性保存文件,而不是 如需同时上传多个文件,请使用 upload 组件。 |
上传的文件会立即保存在默认的 FileStorage 中。如需以编程的方式控制文件的存储,可以使用 fileStoragePutMode 属性。
|
数据绑定
fileStorageUploadField 支持用户上传文件至 文件存储 并作为一个 FileRef 对象设置给实体属性。
下面例子中,User 实体的 picture 属性是 FileRef 类型。
@Column(name = "PICTURE", length = 1024)
private FileRef picture;
<data>
<instance class="com.company.onboarding.entity.User" id="userDc">
<fetchPlan extends="_base"/>
<loader id="userDl"/>
</instance>
</data>
<layout>
<fileStorageUploadField dataContainer="userDc"
property="picture"
clearButtonVisible="true"
fileNameVisible="true"/>
</layout>
fileStorageUploadField 的 dataContainer 属性指定连接的数据容器;property 属性指定展示在 fileStorageUploadField 的实体属性名。
国际化
fileStorageUploadField 的所有标签和消息都可以配置。
-
label 属性。
-
uploadText 属性。
-
requiredMessage 属性。
-
helperText 属性。
-
fileTooBigText 属性。
fileNotSelectedText
设置当 fileNameVisible="true" 而文件还未上传时显示的文本。默认显示 "File is not selected(未选择文件)"。
该属性可以是文本本身或者 消息包 中的一个键值。如果是消息包键值,则必须以 msg:// 开头。
incorrectFileTypeText
设置当文件扩展名不包含在 acceptedFileTypes 属性时显示的消息。
该属性可以是文本本身或者 消息包 中的一个键值。如果是消息包键值,则必须以 msg:// 开头。
XML 属性
id - acceptedFileTypes - alignSelf - classNames - clearButtonAriaLabel - clearButtonVisible - colspan - connectingStatusText - css - dataContainer - dropAllowed - enabled - errorMessage - fileNameVisible - fileNotSelectedText - fileStorageName - fileStoragePutMode - fileTooBigText - height - helperText - incorrectFileTypeText - label - maxFileSize - maxHeight - maxWidth - minHeight - minWidth - processingStatusText - property - readOnly - remainingTimeText - remainingTimeUnknownText - required - requiredMessage - uploadDialogCancelText - uploadDialogTitle - uploadIcon - uploadText - visible - width
acceptedFileTypes
指定服务器能接收的文件类型。文件格式使用 MIME 类型模式 或文件扩展名定义。
| MIME 类型具有广泛的支持,而文件扩展名仅在某些浏览器支持,因此需要尽可能避免使用扩展名。 |
<fileStorageUploadField dataContainer="userDc"
property="picture"
acceptedFileTypes="image/png, .png"/>
acceptedFileTypes 属性能过滤系统文件选择对话框中的文件类型,确保用户只能选择允许的类型。
|
fileStorageName
设置上传文件保存的 FileStorage 名称。如果未设置,则使用默认的文件存储。
fileStoragePutMode
设置文件放入文件存储的模式。fileStoragePutMode 属性默认设置为 IMMEDIATE。如果设置为 MANUAL 值,则能以编程的方式控制文件的保存:
<fileStorageUploadField id="manuallyControlledField"
dataContainer="userDc"
property="picture"
clearButtonVisible="true"
fileNameVisible="true"
fileStoragePutMode="MANUAL"/>
视图控制器中,定义组件和 TemporaryStorage 接口。然后订阅文件上传成功或出错的 事件:
@Autowired
private TemporaryStorage temporaryStorage;
@ViewComponent
private FileStorageUploadField manuallyControlledField;
@Autowired
private Notifications notifications;
@Subscribe("manuallyControlledField")
public void onManuallyControlledFieldFileUploadSucceeded(
final FileUploadSucceededEvent<FileStorageUploadField> event) {
Receiver receiver = event.getReceiver();
if (receiver instanceof FileTemporaryStorageBuffer) {
UUID fileId = ((FileTemporaryStorageBuffer) receiver)
.getFileData().getFileInfo().getId();
File file = temporaryStorage.getFile(fileId);
if (file != null) {
notifications.create("File is uploaded to temporary storage at "
+ file.getAbsolutePath())
.show();
}
FileRef fileRef = temporaryStorage.putFileIntoStorage(fileId, event.getFileName());
manuallyControlledField.setValue(fileRef);
notifications.create("Uploaded file: "
+ ((FileTemporaryStorageBuffer) receiver).getFileData().getFileName())
.show();
}
}
该组件将文件上传至临时存储之后,便会调用 FileUploadSucceedEvent 的监听器。
TemporaryStorage.putFileIntoStorage() 方法将上传的文件从临时客户端存储移至默认的 文件存储。
在上传具有 MANUAL 模式的 FileStorageUploadField 字段后,不会自动触发 ComponentValueChangeEvent,因为 FileRef 的值只能在文件上传至永久文件存储后获得。
|
事件和处理器
AttachEvent - ComponentValueChangeEvent - DetachEvent - FileUploadFailedEvent - FileUploadFileRejectedEvent - FileUploadFinishedEvent - FileUploadProgressEvent - FileUploadStartedEvent - FileUploadSucceededEvent - statusChangeHandler - validator
|
在 Jmix Studio 生成处理器桩代码时,可以使用 Jmix UI 组件面板的 Handlers 标签页或者视图类顶部面板的 Generate Handler 添加,也可以通过 Code → Generate 菜单(Alt+Insert / Cmd+N)生成。 |
FileUploadFailedEvent
当产生 Upload 的 FailedEvent 事件时,会触发 io.jmix.flowui.kit.component.upload.event.FileUploadFailedEvent。参考 Upload.addFailedListener(ComponentEventListener)。
@Subscribe("manuallyControlledField")
public void onManuallyControlledFieldFileUploadFailed(
final FileUploadFailedEvent<FileStorageUploadField> event) {
notifications.create("File upload error")
.show();
}
FileUploadFileRejectedEvent
当产生 Upload 的 FileRejectedEvent 事件时,会触发 io.jmix.flowui.kit.component.upload.event.FileUploadFileRejectedEvent。参考 Upload.addFileRejectedListener(ComponentEventListener)。
FileUploadFinishedEvent
当产生 Upload 的 FinishedEvent 事件时,会触发 io.jmix.flowui.kit.component.upload.event.FileUploadFinishedEvent。参考 Upload.addFinishedListener(ComponentEventListener)。
FileUploadProgressEvent
当产生 Upload 的 ProgressUpdateEvent 事件时,会触发 io.jmix.flowui.kit.component.upload.event.FileUploadProgressEvent。参考 Upload.addProgressListener(ComponentEventListener)。
FileUploadStartedEvent
当产生 Upload 的 StartedEvent 事件时,会触发 io.jmix.flowui.kit.component.upload.event.FileUploadStartedEvent。参考 Upload.addStartedListener(ComponentEventListener)。
FileUploadSucceededEvent
当产生 Upload 的 SucceededEvent 事件时,会触发 io.jmix.flowui.kit.component.upload.event.FileUploadSucceededEvent,表示上传文件已经成功接收。参考 Upload.addSucceededListener(ComponentEventListener)。
下面是使用 fileStorageUploadField 上传 .xls 或 .xlsx 文件的示例,文件在 FileUploadSucceededEvent 事件中处理。
@Subscribe("fileRefField")
public void onFileRefFieldFileUploadSucceeded(
final FileUploadSucceededEvent<FileStorageUploadField> event) {
if (event.getReceiver() instanceof FileTemporaryStorageBuffer buffer) {
UUID fileId = buffer.getFileData().getFileInfo().getId();
log.info("FileId: " + fileId);
File file = temporaryStorage.getFile(fileId); (1)
log.info("File from temp storage: " + file);
try { (2)
List<String> lines = FileUtils.readLines(file, StandardCharsets.UTF_8);
for (String line : lines) {
log.info("Read line: " + line);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
temporaryStorage.deleteFile(fileId); (3)
log.info("File is deleted from temp storage: " + file);
}
}
| 1 | 使用上传事件提供的 id 从 临时存储 获取文件。 |
| 2 | 处理文件数据。 |
| 3 | 删除上传的文件。在真实的应用程序中,这里可以使用 temporaryStorage.putFileIntoStorage() 方法将文件移至 FileStorage。 |
fileStoragePutMode 的介绍中也有 FileUploadSucceededEvent 的示例。