3.9.8.3. FileLoader 接口

使用 FileLoader 接口可以在中间层和客户端层使用相同的一组方法处理文件存储。文件的上传和下载是使用“流”的方式执行的:

  • saveStream() – 将 InputStream 内容保存到文件存储中。

  • openStream() – 返回输入流以从文件存储加载文件内容。

FileLoader 的客户端和服务端实现遵循通用规则:始终通过在输入和输出流之间复制数据来进行文件传输。在应用程序的任何层,文件都不会完全加载到内存中,从而可以传输几乎任何大小的文件。

作为使用 FileLoader 的一个例子,我们考虑一个简单的任务,将用户输入的内容保存到文本文件中,并在同一界面上的另一个字段中显示文件内容。

该界面包含两个 textArea 字段。假设用户在第一个 textArea 中输入文本,单击下面的 buttonIn,文本将保存到 FileStorage。通过单击 buttonOut,第二个 textArea 将显示保存文件的内容。

下面是上述界面的 XML 描述片段:

  1. <hbox margin="true"
  2. spacing="true">
  3. <vbox spacing="true">
  4. <textArea id="textAreaIn"/>
  5. <button id="buttonIn"
  6. caption="Save text in file"
  7. invoke="onButtonInClick"/>
  8. </vbox>
  9. <vbox spacing="true">
  10. <textArea id="textAreaOut"
  11. editable="false"/>
  12. <button id="buttonOut"
  13. caption="Show the saved text"
  14. invoke="onButtonOutClick"/>
  15. </vbox>
  16. </hbox>

界面控制器包含两个按钮上调用的方法:

  • onButtonInClick() 方法中,我们用第一个 textArea 的输入内容创建一个字节数组。然后我们创建一个 FileDescriptor 对象,并使用其属性定义新文件名、扩展名、大小和创建日期。

    然后我们使用 FileLoadersaveStream() 方法保存新文件,将 FileDescriptor 传递给它,并使用 InputStream supplier 提供文件内容。最后使用 DataManager 接口将 FileDescriptor 提交到数据存储。

  • onButtonOutClick() 方法中,我们使用 FileLoaderopenStream() 方法提取保存的文件的内容。然后我们在第二个 textArea 中显示文件的内容。

  1. import com.haulmont.cuba.core.entity.FileDescriptor;
  2. import com.haulmont.cuba.core.global.DataManager;
  3. import com.haulmont.cuba.core.global.FileLoader;
  4. import com.haulmont.cuba.core.global.FileStorageException;
  5. import com.haulmont.cuba.core.global.Metadata;
  6. import com.haulmont.cuba.gui.components.AbstractWindow;
  7. import com.haulmont.cuba.gui.components.ResizableTextArea;
  8. import com.haulmont.cuba.gui.upload.FileUploadingAPI;
  9. import org.apache.commons.io.IOUtils;
  10. import javax.inject.Inject;
  11. import java.io.ByteArrayInputStream;
  12. import java.io.IOException;
  13. import java.io.InputStream;
  14. import java.util.Date;
  15. public class FileLoaderScreen extends AbstractWindow {
  16. @Inject
  17. private Metadata metadata;
  18. @Inject
  19. private FileLoader fileLoader;
  20. @Inject
  21. private DataManager dataManager;
  22. @Inject
  23. private ResizableTextArea textAreaIn;
  24. @Inject
  25. private ResizableTextArea textAreaOut;
  26. private FileDescriptor fileDescriptor;
  27. public void onButtonInClick() {
  28. byte[] bytes = textAreaIn.getRawValue().getBytes();
  29. fileDescriptor = metadata.create(FileDescriptor.class);
  30. fileDescriptor.setName("Input.txt");
  31. fileDescriptor.setExtension("txt");
  32. fileDescriptor.setSize((long) bytes.length);
  33. fileDescriptor.setCreateDate(new Date());
  34. try {
  35. fileLoader.saveStream(fileDescriptor, () -> new ByteArrayInputStream(bytes));
  36. } catch (FileStorageException e) {
  37. throw new RuntimeException(e);
  38. }
  39. dataManager.commit(fileDescriptor);
  40. }
  41. public void onButtonOutClick() {
  42. try {
  43. InputStream inputStream = fileLoader.openStream(fileDescriptor);
  44. textAreaOut.setValue(IOUtils.toString(inputStream));
  45. } catch (FileStorageException | IOException e) {
  46. throw new RuntimeException(e);
  47. }
  48. }
  49. }

fileLoader recipe