- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道 Vaadin 14 提供 Upload供用户选择要上传的文件或拖放文件的组件。
但是我不知道如何使用它。我希望将 Web 浏览器计算机上的纯文本文件的内容作为 String
加载到内存中。或CharSequence
在服务器计算机上。
虽然该组件的描述页面有一些示例,但我可以使用加载纯文本的完整但最小的示例。
最佳答案
以下是 Vaadin 14.1.0.alpha3 中的示例 View 。我不是上传
方面的专家,因此可能有更好的方法,但这似乎有效。
注意@Route
注释,并进行调整以适合您自己的应用程序。
Upload
组件是出现在网页上的可视化小部件,邀请用户拖放文件或使用文件选择器对话框。我们添加一个匿名监听器对象,在此处以 lambda 语法定义,以便在用户执行此操作时调用。一个FinishedEvent
对象作为正在上传的文件的句柄传递给我们的监听器。
接收上传八位字节的对象是 Vaadin Receiver
的任何实现界面。要将单个文件加载到内存中,请使用 MemoryBuffer
执行。通过将 MemoryBuffer
实例传递给 Upload
实例,我们为上传的八位字节到达服务器时指定一个位置。
我们使用InputStream
管理到达八位字节的流。在此示例中,我们逐一读取到达的八位字节。或者,有多种方法可以一起读取多个八位字节。
我们的InputStream
将每个八位字节读取为int
,其值范围为0-255(含)。 -1
值表示输入流已结束。因此,我们在 while
循环中收集这些 int
值,直到出现负数。
我们使用try-with-resources automatically close 的语法将字节从客户端加载到服务器的InputStream
。
我们将到达的八位字节收集在 ByteArrayOutputStream
中。下一步是理解这些收集到的八位字节。这里没有魔法。您必须知道想要的内容,例如plain text与格式化文本对比tab-delimited数据与二进制数据与文档格式,如 PDF 。在此示例中,我们期望纯文本。对于文本,我们必须知道字符编码,例如 ASCII , UTF-8 ,或遗产Windows-1252编码。在我们的例子中,我们期望 UTF-8 编码。因此,我们通过实例化一个新的 String
对象,将其组合在一起,将我们收集的八位字节和一个表示我们期望的 UTF-8 的枚举对象传递给构造函数: new String( bytesReceived.toByteArray() , StandardCharsets.UTF_8)
。
有了新的字符串,我们通过实例化 HTML 段落向用户回显文件的内容。
这是整个示例类。
package work.basil.example;
import com.vaadin.flow.component.html.H1;
import com.vaadin.flow.component.html.Paragraph;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.upload.FinishedEvent;
import com.vaadin.flow.component.upload.Upload;
import com.vaadin.flow.component.upload.receivers.MemoryBuffer;
import com.vaadin.flow.router.Route;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
@Route ( "upload" )
public class UploadView extends VerticalLayout
{
// Constructor
public UploadView ( )
{
this.add( new H1( "Upload" ) );
MemoryBuffer buffer = new MemoryBuffer();
Upload upload = new Upload( buffer ); // Connect our server-side `Receiver` implementation to the client-side `Upload` widget.
upload.addFinishedListener(
( FinishedEvent finishedEvent ) -> { // Event fired when user uses the `Upload` widget on the web page.
try ( // Autoclosable interface used in try-with-resources syntax.
InputStream inputStream = buffer.getInputStream() ;
)
{
// read the contents of the buffer.
// https://www.baeldung.com/convert-input-stream-to-array-of-bytes
ByteArrayOutputStream bytesReceived = new ByteArrayOutputStream();
int content; // Represents each octet arriving on server from client.
while ( ( content = inputStream.read() ) != - 1 ) // The arriving octet is returned to us as an `int` in the range 0 to 255. A value of -1 signals end-of-stream. Blocks until data arrives or stream closes.
{
bytesReceived.write( content ); // Collect the arriving octets into a `ByteArrayOutputStream`.
}
// Parse the collected octets as being text in UTF-8 encoding.
String s = new String( bytesReceived.toByteArray() , StandardCharsets.UTF_8 ); // You must know the particular character-encoding used in the file.
this.add( new Paragraph( s ) ); // Echo the file contents back to the user.
System.out.println( "s = " + s );
}
catch ( IOException e )
{
e.printStackTrace();
}
}
);
this.add( upload ); // Make the `Upload` instance named `upload` appear on our Vaadin-produced web page.
}
}
<小时/>
我们可以简化上面的代码。 Vaadin 14.1 捆绑 Apache Commons IO 2.5 库。该库有一个方便的方法来获取InputStream
并生成String
。因此可以将上面的一大块代码变成单行代码。调用静态方法org.apache.commons.io.IOUtils.toString
。传递输入流,并指定预期的字符编码。
修改后的代码:
package work.basil.example ;
import com.vaadin.flow.component.html.H1;
import com.vaadin.flow.component.html.Paragraph;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.upload.FinishedEvent;
import com.vaadin.flow.component.upload.Upload;
import com.vaadin.flow.component.upload.receivers.MemoryBuffer;
import com.vaadin.flow.router.PreserveOnRefresh;
import com.vaadin.flow.router.Route;
import org.apache.commons.io.IOUtils;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
@PreserveOnRefresh
@Route ( "upload" )
public class UploadView extends VerticalLayout
{
// Constructor
public UploadView ( )
{
this.add( new H1( "Upload" ) );
MemoryBuffer buffer = new MemoryBuffer();
Upload upload = new Upload( buffer ); // Connect our server-side `Receiver` implementation to the client-side `Upload` widget.
upload.addFinishedListener(
( FinishedEvent finishedEvent ) -> { // Event fired when user uses the `Upload` widget on the web page.
try ( // Autoclosable interface used in try-with-resources syntax.
InputStream inputStream = buffer.getInputStream() ;
)
{
// Read the data arriving in the buffer via the `InputStream` to produce a `String` object.
String s = IOUtils.toString( inputStream , StandardCharsets.UTF_8 );
this.add( new Paragraph( s ) );
System.out.println( "s = " + s );
}
catch ( IOException e )
{
e.printStackTrace();
}
}
);
this.add( upload ); // Make the `Upload` instance named `upload` appear on our Vaadin-produced web page.
}
}
<小时/>
警告:正如您所要求的,上面的示例是最基本的。我们没有进行任何错误处理,也没有对用户中途取消上传使用react。
<小时/>您可以通过阅读 source code of the Upload
component’s demo page 了解更多信息由 Vaadin Ltd 公司提供。
并阅读这篇关于 Vaadin Flow 中上传如何工作的详细文章,Uploads and downloads, inputs and outputs作者:马蒂·塔沃宁。
关于java - 使用 Vaadin 14 中的 "Upload"小部件将文本文件的内容上传到内存中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58493706/
我在具有 2CPU 和 3.75GB 内存 (https://aws.amazon.com/ec2/instance-types/) 的 c3.large Amazon EC2 ubuntu 机器上运
我想通过用户空间中的mmap-ing并将地址发送到内核空间从用户空间写入VGA内存(视频内存,而不是缓冲区),我将使用pfn remap将这些mmap-ed地址映射到vga内存(我将通过 lspci
在 Mathematica 中,如果你想让一个函数记住它的值,它在语法上是很轻松的。例如,这是标准示例 - 斐波那契: fib[1] = 1 fib[2] = 1 fib[n_]:= fib[n] =
我读到动态内存是在运行时在堆上分配的,而静态内存是在编译时在堆栈上分配的,因为编译器知道在编译时必须分配多少内存。 考虑以下代码: int n; cin>>n; int a[n]; 如果仅在运行期间读
我是 Python 的新手,但我之前还不知道这一点。我在 for 循环中有一个基本程序,它从站点请求数据并将其保存到文本文件但是当我检查我的任务管理器时,我发现内存使用量只增加了?长时间运行时,这对我
我正在设计一组数学函数并在 CPU 和 GPU(使用 CUDA)版本中实现它们。 其中一些函数基于查找表。大多数表占用 4KB,其中一些占用更多。基于查找表的函数接受一个输入,选择查找表的一两个条目,
读入一个文件,内存被动态分配给一个字符串,文件内容将被放置在这里。这是在函数内部完成的,字符串作为 char **str 传递。 使用 gdb 我发现在行 **(str+i) = fgetc(aFil
我需要证实一个理论。我正在学习 JSP/Java。 在查看了一个现有的应用程序(我没有写)之后,我注意到一些我认为导致我们的性能问题的东西。或者至少是其中的一部分。 它是这样工作的: 1)用户打开搜索
n我想使用memoization缓存某些昂贵操作的结果,这样就不会一遍又一遍地计算它们。 两个memoise和 R.cache适合我的需要。但是,我发现缓存在调用之间并不可靠。 这是一个演示我看到的问
我目前正在分析一些 javascript shell 代码。这是该脚本中的一行: function having() { memory = memory; setTimeout("F0
我有一种情况,我想一次查询数据库,然后再将整个数据缓存在内存中。 我得到了内存中 Elasticsearch 的建议,我用谷歌搜索了它是什么,以及如何在自己的 spring boot 应用程序中实现它
我正在研究 Project Euler (http://projecteuler.net/problem=14) 的第 14 题。我正在尝试使用内存功能,以便将给定数字的序列长度保存为部分结果。我正在
所以,我一直在做 Java 内存/注意力游戏作业。我还没有达到我想要的程度,它只完成了一半,但我确实让 GUI 大部分工作了......直到我尝试向我的框架添加单选按钮。我认为问题可能是因为我将 JF
我一直在尝试使用 Flask-Cache 的 memoize 功能来仅返回 statusTS() 的缓存结果,除非在另一个请求中满足特定条件,然后删除缓存。 但它并没有被删除,并且 Jinja 模板仍
我对如何使用 & 运算符来减少内存感到非常困惑。 我可以回答下面的问题吗? clase C{ function B(&$a){ $this->a = &$a; $thi
在编写代码时,我遇到了一个有趣的问题。 我有一个 PersonPOJO,其 name 作为其 String 成员之一及其 getter 和 setter class PersonPOJO { priv
在此代码中 public class Base { int length, breadth, height; Base(int l, int b, int h) { l
Definition Structure padding is the process of aligning data members of the structure in accordance
在 JavaScript Ninja 的 secret 中,作者提出了以下方案,用于在没有闭包的情况下内存函数结果。他们通过利用函数是对象这一事实并在函数上定义一个属性来存储过去调用函数的结果来实现这
我正在尝试找出 map 消耗的 RAM 量。所以,我做了以下事情;- Map cr = crPair.collectAsMap(); // 200+ entries System.out.printl
我是一名优秀的程序员,十分优秀!