Is there a way to show the progress of the file upload from temporaryStorage to fileStorage. I dealy an event listener that can update the UI with the progress of the upload
Sure:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<window xmlns="http://jmix.io/schema/ui/window"
caption="msg://sampleScreen.caption">
<layout>
<fileStorageUpload id="uploadField"
fileStoragePutMode="MANUAL"
showFileName="true"
showClearButton="true"/>
</layout>
</window>
package com.company.demo.screen.sample;
import io.jmix.core.FileRef;
import io.jmix.ui.Dialogs;
import io.jmix.ui.component.FileStorageUploadField;
import io.jmix.ui.component.SingleFileUploadField;
import io.jmix.ui.executor.BackgroundTask;
import io.jmix.ui.executor.TaskLifeCycle;
import io.jmix.ui.screen.Screen;
import io.jmix.ui.screen.Subscribe;
import io.jmix.ui.screen.UiController;
import io.jmix.ui.screen.UiDescriptor;
import io.jmix.ui.upload.TemporaryStorage;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
@UiController("SampleScreen")
@UiDescriptor("sample-screen.xml")
public class SampleScreen extends Screen {
@Autowired
private FileStorageUploadField uploadField;
@Autowired
private TemporaryStorage temporaryStorage;
@Autowired
private Dialogs dialogs;
@Subscribe("uploadField")
public void onUploadFieldFileUploadSucceed(SingleFileUploadField.FileUploadSucceedEvent event) {
BackgroundTask<Integer, FileRef> task = new TransferFileTask(uploadField.getFileId(), event.getFileName());
dialogs.createBackgroundWorkDialog(this, task)
.withCaption("Please wait")
.withMessage("Moving file to file storage...")
.show();
}
private class TransferFileTask extends BackgroundTask<Integer, FileRef> {
private String fileName;
private UUID tempFileId;
public TransferFileTask(UUID tempFileId, String fileName) {
super(3, TimeUnit.MINUTES, SampleScreen.this);
this.tempFileId = tempFileId;
this.fileName = fileName;
}
@Override
public FileRef run(TaskLifeCycle<Integer> taskLifeCycle) throws Exception {
FileRef fileRef = temporaryStorage.putFileIntoStorage(tempFileId, fileName);
// delay for demo
Thread.sleep(5000);
return fileRef;
}
@Override
public void done(FileRef result) {
uploadField.setValue(result);
}
}
}