如何从GWT FileUpload组件中检索文件?

4

我希望使用GWT fileUploader组件上传文件,

我尝试了以下代码:

FileUpload fileUpload = new FileUpload();
filepload.addChangeHandler(new new ChangeHandler() {
    @Override
    public void onChange(ChangeEvent event) {
         // here i submit the form, and a response is created to client side to display success message.
    } });
  • 好的,到目前为止我已经可以上传文件,在servlet中也能成功地给出一个成功的信息。
  • 我在表单面板的onSubmitComplete事件中处理了它,非常感谢。
  • 让我再问一件事情,有没有办法在将文件保存到数据库之前显示已上传的文件呢?
  • 也就是说,我需要提供一个组合组件,用于上传文件和文本区域以告知有关该文件的详细信息。
  • 当用户选择要上传的文件时,我想提供一个显示已上传文件的界面(以便他可以确保正确的文件已上传)
  • 并且当整个表单提交时,它将保存到数据库中。

1
你尝试了什么?请添加一些代码。 - bNd
你已经存储了文件,因此你知道保存它的路径。你需要上传者提供什么? - Andrei Volgin
@AndreiVolgin 实际上,我想上传任何类型的文件,然后将其存储为字节数组。因此,我需要该文件的内容。为此,我需要文件的绝对路径..有没有办法获取它?我想使用GWT组件完成这个任务。 - Dipak
我尝试过这样写: FileUpload fileUpload = new FileUpload(); filepload.addChangeHandler(new new ChangeHandler() {
@Override public void onChange(ChangeEvent event) {
// 在这里,我想要将上传的文件作为字节数组获取。 } });
- Dipak
2
你只能在服务器端获取绝对路径,而不能在客户端获取。FileUpload允许用户上传文件。你必须将此小部件放在表单(FormPanel)内(并从中提交)。在提交时,你必须调用servlet。在那里,你需要编写一个文件上传代码。 - bNd
将FileUpload放置在FormPanel中,并使用form.submit()方法。在服务器端,创建一个servlet并将其读作文件流并输出为字节流,然后您就可以存储到数据库中。 - SwiftMango
3个回答

4

我猜你想让用户使用GWT Fileupload小部件上传文件,然后不希望在服务器端处理它。 你想在客户端获得一个字节数组表示。

文件处理的通常步骤为: 浏览器 -> 文件上传对话框 -> 选择文件 -> 提交包含文件的表单到服务器 -> 在服务器上处理文件 -> 将处理后的文件作为响应发送回客户端(字符串)。

如果你想避免以上步骤并在浏览器中处理文件,则当前的JavaScript没有办法做到。类似Flash、Applet、Silverlight或Activex等并行技术可能会有所帮助。未来应该采用正确的方法是使用HTML5文件API

如果你不想使用Flash/Applet等传统技术,那么可以探索FileReader上的HTML5 API。然而,需要权衡考虑的是你需要检查API是否在各种浏览器中得到支持。

HTML5 FileReader

FileReader提供了四个异步读取文件的选项:

FileReader.readAsBinaryString(Blob|File) - The result property will contain the file/blob's data as a binary string.
FileReader.readAsText(Blob|File, opt_encoding) - The result property will contain the file/blob's data as a text string. 
FileReader.readAsDataURL(Blob|File) - The result property will contain the file/blob's data encoded as a data URL.
FileReader.readAsArrayBuffer(Blob|File) - The result property will contain the file/blob's data as an ArrayBuffer object.

GWT文件系统包装器示例 - https://github.com/bradrydzewski/gwt-filesystem

参考资料 -


常规的文件处理步骤为:浏览器 -> 文件上传对话框 -> 选择文件 -> 提交带有文件的表单到服务器 -> 在服务器上处理文件 -> 将处理后的文件作为响应发送回客户端(字符串)。在这些常规步骤中,如果我需要为用户提供有关已上传文件的审查,该怎么办?我需要一个流程如下:浏览器 -> 文件上传对话框 -> 选择文件 -> 在浏览器中显示已上传的文件 -> 提交带有文件的表单到服务器 -> 在服务器上处理文件 -> 将处理后的文件作为响应发送回客户端(字符串)。 - Dipak
当前的JavaScript中没有这样的选项。如果您不打算使用其他遗留技术,如Flash / Applet,则可以探索HTML5 FileReader上的API - FileReader.readAsBinaryString(Blob | File)。但是需要权衡的是,您需要检查API在浏览器中是否受支持。 - appbootup
有关HTML5文件读取器API和它们的GWT包装器的更新细节。 - appbootup

1

您可以使用以下代码在客户端(在您的GWT代码中)获取文件名及其扩展名:

FileUpload fileUpload = new FileUpload();

Button uploadButton = new Button("Click");
uploadButton.addClickHandler(new ClickHandler() {
  public void onClick(ClickEvent event) {
    String filename = fileUpload.getFilename();
      Window.alert(filename);
  }
});

3
文件名并不会返回实际的文件路径,而是返回一个虚假的路径以确保安全。 - Dipak

1

请告诉我如何上传它。 - Dipak
我在我的回答中添加了链接。 - Andrei Volgin
谢谢你提供的链接,你能否看一下更新后的问题,看看能否帮我解决呢? - Dipak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接