我有GXT GWT项目(<inherits name='com.sencha.gxt.ui.GXT'/>)。我需要上传文件从计算机和获取字节数组的文件。
我在客户端写了上传文件,一切都很好,但是我需要添加服务器部分来获取文件的内容,怎么做呢?我的客户端:
public class FileUpload implements IsWidget {
private static FileUploadUiBinder fileUploadUiBinder = GWT.create(FileUploadUiBinder.class);
@UiTemplate("FileUpload.ui.xml")
interface FileUploadUiBinder extends UiBinder<Component, FileUpload> {
}
@UiField
FileUploadField uploadedFile;
private FieldLabel label;
@Override
public Widget asWidget() {
if (label == null) {
label = (FieldLabel) fileUploadUiBinder.createAndBindUi(this);
uploadedFile.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
Info.display("File Changed", "You selected " + uploadedFile.getValue());
}
});
}
return label;
}
}和FileUpload.ui.xml
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder
xmlns:form="urn:import:com.sencha.gxt.widget.core.client.form"
xmlns:gxt="urn:import:com.sencha.gxt.widget.core.client"
xmlns:ui='urn:ui:com.google.gwt.uibinder'
xmlns="urn:import:com.sencha.gxt.widget.core.client.container"
<form:FieldLabel>
<form:widget>
<form:FileUploadField ui:field="uploadedFile" name="metadataFile"/>
</form:widget>
</form:FieldLabel>
</ui:UiBinder>所以:我需要添加服务器部分:如何在服务器部分中获取字节数组(文件内容)?我需要一个例子:)也许有人给我提供了工作例子的链接?请帮帮我。
发布于 2015-09-10 14:36:32
不幸的是,为了展示一些如何将文件数据发送到服务器端的示例,您的代码需要做很多更改。我应该提一下,这只是一种可能的解决方案。不过,这里的客户机-服务器请求将发送到HttpServlet,而不是通过标准的GWT RPC。以下是我的更改:
1)更改FileUpload.ui.xml:
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:form="urn:import:com.sencha.gxt.widget.core.client.form"
xmlns:gxt="urn:import:com.sencha.gxt.widget.core.client"
xmlns:ui='urn:ui:com.google.gwt.uibinder'
xmlns="urn:import:com.sencha.gxt.widget.core.client.container"
>
<form:FormPanel>
<form:FieldLabel>
<form:widget>
<form:FileUploadField ui:field="uploadedFile"
name="metadataFile" />
</form:widget>
</form:FieldLabel>
</form:FormPanel>
</ui:UiBinder>2)更改FileUpload.java:
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiTemplate;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Widget;
import com.sencha.gxt.widget.core.client.Component;
import com.sencha.gxt.widget.core.client.event.SubmitCompleteEvent;
import com.sencha.gxt.widget.core.client.form.FileUploadField;
import com.sencha.gxt.widget.core.client.form.FormPanel;
import com.sencha.gxt.widget.core.client.info.Info;
public class FileUpload implements IsWidget {
private static FileUploadUiBinder fileUploadUiBinder = GWT.create(FileUploadUiBinder.class);
@UiTemplate("FileUpload.ui.xml")
interface FileUploadUiBinder extends UiBinder<Component, FileUpload> {
}
@UiField
FileUploadField uploadedFile;
private FormPanel formPanel;
@Override
public Widget asWidget() {
if (formPanel == null) {
formPanel = (FormPanel) fileUploadUiBinder.createAndBindUi(this);
formPanel.setEncoding(FormPanel.Encoding.MULTIPART);
formPanel.setMethod(FormPanel.Method.POST);
formPanel.setAction("file.upload"); // This action should
// point to servlet registered in WEB_INF/web.xml
formPanel.addSubmitCompleteHandler(new SubmitCompleteEvent.SubmitCompleteHandler() {
public void onSubmitComplete(SubmitCompleteEvent event) {
String resultHtml = event.getResults();
Info.display("Upload Response", resultHtml);
}
});
uploadedFile.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
Info.display("File Changed", "You selected " +
uploadedFile.getValue());
formPanel.submit(); // It's better to do it by
// clicking on submitting button or something.
}
});
}
return formPanel;
}
}3) web.xml (只添加parts,不使用home.test.uploadtest,使用自己的包):
<... other servlet blocks ...>
<servlet>
<servlet-name>fileUploadServlet</servlet-name>
<servlet-class>home.test.uploadtest.server.FileUploadServlet</servlet-class>
</servlet>
<... other servlet-mapping blocks ...>
<servlet-mapping>
<servlet-name>fileUploadServlet</servlet-name>
<url-pattern>/file.upload</url-pattern>
</servlet-mapping> 4) FileUploadServlet.java (主要是服务器端操作的虚拟示例):
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class FileUploadServlet extends HttpServlet {
private static final long serialVersionUID = -1L;
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/plain");
File tempDir = new File(System.getProperty("java.io.tmpdir"));
FileItemFactory factory = new DiskFileItemFactory(1000000, tempDir);
ServletFileUpload upload = new ServletFileUpload(factory);
File target = null;
try {
try {
List<?> items = upload.parseRequest(request);
Iterator<?> it = items.iterator();
while (it.hasNext()) {
FileItem item = (FileItem) it.next();
if (item.isFormField()) {
throw new ServletException("Unsupported non-file property [" +
item.getFieldName() + "] with value: " + item.getString());
} else {
target = File.createTempFile("temp_", ".data", tempDir);
item.write(target);
item.delete();
System.out.println("Temp file: " + target.getAbsolutePath());
}
}
} catch (ServletException e) {
throw e;
} catch (Exception e) {
throw new IllegalStateException(e);
}
response.getWriter().write("File length: " + target.length());
response.getWriter().close();
} finally {
if (target != null && target.exists())
target.delete();
}
}
}因此,正如您所看到的,存在对https://commons.apache.org/proper/commons-fileupload/的依赖
PS:我认为由于代码太多,我可能会忘记一些东西。在这种情况下,请让我知道。
https://stackoverflow.com/questions/32441618
复制相似问题