You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

FileDownloaderUI.java 6.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. package com.vaadin.tests.components;
  2. import java.awt.image.BufferedImage;
  3. import java.io.BufferedOutputStream;
  4. import java.io.ByteArrayInputStream;
  5. import java.io.ByteArrayOutputStream;
  6. import java.io.File;
  7. import java.io.FileOutputStream;
  8. import java.io.IOException;
  9. import java.io.InputStream;
  10. import java.util.ArrayList;
  11. import java.util.List;
  12. import javax.imageio.ImageIO;
  13. import com.vaadin.server.ClassResource;
  14. import com.vaadin.server.ConnectorResource;
  15. import com.vaadin.server.FileDownloader;
  16. import com.vaadin.server.FileResource;
  17. import com.vaadin.server.StreamResource;
  18. import com.vaadin.server.VaadinRequest;
  19. import com.vaadin.server.VaadinResponse;
  20. import com.vaadin.tests.components.embedded.EmbeddedPdf;
  21. import com.vaadin.ui.AbstractComponent;
  22. import com.vaadin.ui.Button;
  23. import com.vaadin.ui.Component;
  24. import com.vaadin.ui.CssLayout;
  25. import com.vaadin.ui.HorizontalLayout;
  26. import com.vaadin.ui.Label;
  27. import com.vaadin.ui.Layout;
  28. import com.vaadin.ui.NativeButton;
  29. public class FileDownloaderUI extends AbstractTestUIWithLog {
  30. private AbstractComponent firstDownloadComponent;
  31. @Override
  32. protected void setup(VaadinRequest request) {
  33. List<Class<? extends Component>> components = new ArrayList<>();
  34. components.add(Button.class);
  35. components.add(NativeButton.class);
  36. components.add(CssLayout.class);
  37. components.add(Label.class);
  38. ConnectorResource resource;
  39. resource = new StreamResource(new StreamResource.StreamSource() {
  40. @Override
  41. public InputStream getStream() {
  42. try {
  43. BufferedImage img = getImage2("demo.png");
  44. ByteArrayOutputStream imagebuffer = new ByteArrayOutputStream();
  45. ImageIO.write(img, "png", imagebuffer);
  46. Thread.sleep(5000);
  47. return new ByteArrayInputStream(imagebuffer.toByteArray());
  48. } catch (Exception e) {
  49. e.printStackTrace();
  50. return null;
  51. }
  52. }
  53. }, "demo.png");
  54. addComponents("Dynamic image", resource, components);
  55. try {
  56. File hugeFile = File.createTempFile("huge", ".txt");
  57. hugeFile.deleteOnExit();
  58. BufferedOutputStream os = new BufferedOutputStream(
  59. new FileOutputStream(hugeFile));
  60. int writeAtOnce = 1024 * 1024;
  61. byte[] b = new byte[writeAtOnce];
  62. for (int i = 0; i < 5l * 1024l * 1024l; i += writeAtOnce) {
  63. os.write(b);
  64. }
  65. os.close();
  66. resource = new FileResource(hugeFile);
  67. addComponents("Huge text file", resource, components);
  68. } catch (IOException e) {
  69. e.printStackTrace();
  70. }
  71. resource = new ClassResource(new EmbeddedPdf().getClass(), "test.pdf");
  72. addComponents("Class resource pdf", resource, components);
  73. Button downloadUtf8File = new Button("Download UTF-8 named file");
  74. FileDownloader fd = new FileDownloader(new ClassResource(
  75. new EmbeddedPdf().getClass(), "File åäö-日本語.pdf"));
  76. fd.setOverrideContentType(false);
  77. fd.extend(downloadUtf8File);
  78. addComponent(downloadUtf8File);
  79. addComponent(new Button("Remove first download button", event -> {
  80. Layout parent = (Layout) firstDownloadComponent.getParent();
  81. parent.removeComponent(firstDownloadComponent);
  82. }));
  83. addComponent(new Button(
  84. "Detach FileDownloader from first download button", event -> {
  85. FileDownloader e = (FileDownloader) firstDownloadComponent
  86. .getExtensions().iterator().next();
  87. e.remove();
  88. log("FileDownload detached");
  89. }));
  90. }
  91. public void addComponents(String caption, ConnectorResource resource,
  92. List<Class<? extends Component>> components) {
  93. HorizontalLayout layout = new HorizontalLayout();
  94. layout.setCaption(caption);
  95. for (Class<? extends Component> cls : components) {
  96. try {
  97. AbstractComponent c = (AbstractComponent) cls.newInstance();
  98. if (firstDownloadComponent == null) {
  99. firstDownloadComponent = c;
  100. }
  101. c.setId(cls.getName() + caption.replace(" ", ""));
  102. c.setCaption(cls.getName());
  103. c.setDescription(
  104. resource.getMIMEType() + " / " + resource.getClass());
  105. c.setWidth("100px");
  106. c.setHeight("100px");
  107. layout.addComponent(c);
  108. new FileDownloader(resource).extend(c);
  109. if (c instanceof Button) {
  110. ((Button) c).addClickListener(event -> {
  111. });
  112. }
  113. } catch (Exception e) {
  114. System.err.println("Could not instatiate " + cls.getName());
  115. }
  116. }
  117. addComponent(layout);
  118. }
  119. private static final String DYNAMIC_IMAGE_NAME = "requestImage.png";
  120. @Override
  121. public boolean handleConnectorRequest(VaadinRequest request,
  122. VaadinResponse response, String path) throws IOException {
  123. if (DYNAMIC_IMAGE_NAME.equals(path)) {
  124. // Create an image, draw the "text" parameter to it and output it to
  125. // the browser.
  126. String text = request.getParameter("text");
  127. if (text == null) {
  128. text = DYNAMIC_IMAGE_NAME;
  129. }
  130. BufferedImage bi = getImage(text);
  131. response.setContentType("image/png");
  132. response.setHeader("Content-Disposition",
  133. "attachment; filename=\"" + path + "\"");
  134. ImageIO.write(bi, "png", response.getOutputStream());
  135. return true;
  136. } else {
  137. return super.handleConnectorRequest(request, response, path);
  138. }
  139. }
  140. private BufferedImage getImage(String text) {
  141. BufferedImage bi = new BufferedImage(150, 30,
  142. BufferedImage.TYPE_3BYTE_BGR);
  143. bi.getGraphics().drawChars(text.toCharArray(), 0, text.length(), 10,
  144. 20);
  145. return bi;
  146. }
  147. private BufferedImage getImage2(String text) {
  148. BufferedImage bi = new BufferedImage(200, 200,
  149. BufferedImage.TYPE_INT_RGB);
  150. bi.getGraphics().drawChars(text.toCharArray(), 0, text.length(), 10,
  151. 20);
  152. return bi;
  153. }
  154. }