Java 带Servlet的GWT文件上传
我尝试制作一个非常简单的GWT应用程序:用户可以选择一个txt文件并将其上传到服务器。稍后我想实现更多功能,但目前我仍停留在文件上载上: 在客户端,我使用了以下代码:Java 带Servlet的GWT文件上传,java,servlets,file-upload,gwt,Java,Servlets,File Upload,Gwt,我尝试制作一个非常简单的GWT应用程序:用户可以选择一个txt文件并将其上传到服务器。稍后我想实现更多功能,但目前我仍停留在文件上载上: 在客户端,我使用了以下代码: public class GwtDemoProject implements EntryPoint { private static final String UPLOAD_ACTION_URL = GWT.getModuleBaseURL() + "upload"; private FormPanel form; priva
public class GwtDemoProject implements EntryPoint {
private static final String UPLOAD_ACTION_URL = GWT.getModuleBaseURL() + "upload";
private FormPanel form;
private Label info;
private FileUpload fileupload;
private Button uploadFileBtn;
public void onModuleLoad() {
init();
uploadFileBtn.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
String filename = fileupload.getFilename();
if(filename.length() == 0) {
Window.alert("File Upload failed");
} else if(filename.endsWith(".txt")) {
form.submit();
} else {
Window.alert("File is not a txt-file");
}
}
});
form.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() {
@Override
public void onSubmitComplete(SubmitCompleteEvent event) {
if(event.getResults().length() == 0) {
} else {
Window.alert(event.getResults());
}
}
});
VerticalPanel vp = new VerticalPanel();
vp.add(info);
vp.add(fileupload);
vp.add(new HTML("<br>"));
vp.add(uploadFileBtn);
form.add(vp);
RootPanel rp = RootPanel.get();
rp.add(form);
}
private void init() {
form = new FormPanel();
form.setAction(UPLOAD_ACTION_URL);
form.setEncoding(FormPanel.ENCODING_MULTIPART);
form.setMethod(FormPanel.METHOD_POST);
info = new Label("Wähle eine Textdatei aus");
fileupload = new FileUpload();
uploadFileBtn = new Button("Upload File");
}
}
公共类GwtDemoProject实现入口点{
私有静态最终字符串UPLOAD\u ACTION\u URL=GWT.getModuleBaseURL()+“UPLOAD”;
私人表格小组表格;
自有品牌信息;
私人文件上传;
私有按钮上传文件BTN;
moduleload()上的公共void{
init();
uploadFileBtn.addClickHandler(新的ClickHandler(){
@凌驾
公共作废一次点击(点击事件){
String filename=fileupload.getFilename();
如果(filename.length()==0){
Window.alert(“文件上传失败”);
}else if(filename.endsWith(“.txt”)){
表单提交();
}否则{
警告(“文件不是txt文件”);
}
}
});
form.addSubmitCompleteHandler(新的FormPanel.SubmitCompleteHandler(){
@凌驾
SubmitComplete上的公共无效(SubmitCompleteTEvent事件){
if(event.getResults().length()==0){
}否则{
alert(event.getResults());
}
}
});
VerticalPanel vp=新的VerticalPanel();
副总裁添加(信息);
副总裁添加(文件上传);
vp.add(新HTML(“
”);
vp.add(上传文件BTN);
添加表格(vp);
RootPanel rp=RootPanel.get();
rp.add(表格);
}
私有void init(){
form=新的FormPanel();
表单.setAction(上传操作URL);
form.setEncoding(FormPanel.ENCODING\u MULTIPART);
form.setMethod(FormPanel.METHOD_POST);
信息=新标签(“Wähle eine Textdatei aus”);
fileupload=新建fileupload();
uploadFileBtn=新建按钮(“上载文件”);
}
}
在我的服务器端,我做了以下工作:
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/html");
try {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> items = upload.parseRequest(request);
Iterator<FileItem> iter = items.iterator();
while (iter.hasNext()) {
FileItem item = iter.next();
File uploadedFile = new File("C:\\samplePath\\"+item.getName()+".txt");
item.write(uploadedFile);
}
} catch (Exception exc) {
}
}
}
公共类FileUploadServlet扩展了HttpServlet
{
私有静态最终长serialVersionUID=1L;
@凌驾
受保护的void doPost(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
response.setContentType(“text/html”);
试一试{
DiskFileItemFactory=新的DiskFileItemFactory();
ServletFileUpload upload=新的ServletFileUpload(工厂);
列表项=upload.parseRequest(请求);
迭代器iter=items.Iterator();
while(iter.hasNext()){
FileItem=iter.next();
File uploadedFile=新文件(“C:\\samplePath\\”+item.getName()+”.txt”);
item.write(上传文件);
}
}捕获(异常exc){
}
}
}
在web.xml中,我向servlet添加了以下内容:
<!-- Servlets -->
<servlet>
<servlet-name>uploadServlet</servlet-name>
<servlet-class>de.gwt.demo.server.FileUploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>uploadServlet</servlet-name>
<url-pattern>/gwtdemoproject/upload</url-pattern>
</servlet-mapping>
上传servlet
de.gwt.demo.server.FileUploadServlet
上传servlet
/GWTDemo项目/上传
我没有收到任何错误消息,但我发现Servlet中的列表是空的,因此while循环永远不会执行。请求或提交有问题吗?我对代码做了一些更改: 我更改了应用程序布局:我添加了一个文本区域,显示上传的txt文件的内容。现在,这个非常简单的应用程序将一个txt文件上传到服务器,并保存。然后服务器读取txt文件并将内容发送到客户端,然后删除保存的文件 主要变化: 我给文件上传起了一个名字:
public class GwtFileUploadDemo implements EntryPoint {
private static final String UPLOAD_ACTION_URL = GWT.getModuleBaseURL() + "upload";
private FormPanel form;
private Label info;
private FileUpload fileupload;
private Button uploadFileBtn;
private TextArea outputText;
public void onModuleLoad() {
init();
uploadFileBtn.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
String filename = fileupload.getFilename();
if(filename.length() == 0) {
Window.alert("File Upload failed");
} else if(filename.endsWith(".txt")) {
form.submit();
} else {
Window.alert("File is not a txt file");
}
}
});
form.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() {
@Override
public void onSubmitComplete(SubmitCompleteEvent event) {
if(event.getResults().length() == 0) {
Window.alert("Something went wrong - Try again");
} else {
outputText.setText(event.getResults());
}
}
});
VerticalPanel vp = new VerticalPanel();
vp.add(info);
vp.add(fileupload);
vp.add(new HTML("<br>"));
vp.add(uploadFileBtn);
vp.add(outputText);
form.add(vp);
RootPanel rp = RootPanel.get();
rp.add(form);
}
private void init() {
form = new FormPanel();
form.setAction(UPLOAD_ACTION_URL);
form.setEncoding(FormPanel.ENCODING_MULTIPART);
form.setMethod(FormPanel.METHOD_POST);
info = new Label("Choose a txt file");
fileupload = new FileUpload();
//Here I added a name to the fileuploader
fileupload.setName("uploader");
uploadFileBtn = new Button("Show content of txt File");
outputText = new TextArea();
outputText.setEnabled(false);
}
}
公共类GwtFileUploadDemo实现入口点{
私有静态最终字符串UPLOAD\u ACTION\u URL=GWT.getModuleBaseURL()+“UPLOAD”;
私人表格小组表格;
自有品牌信息;
私人文件上传;
私有按钮上传文件BTN;
私有文本区域输出文本;
moduleload()上的公共void{
init();
uploadFileBtn.addClickHandler(新的ClickHandler(){
@凌驾
公共作废一次点击(点击事件){
String filename=fileupload.getFilename();
如果(filename.length()==0){
Window.alert(“文件上传失败”);
}else if(filename.endsWith(“.txt”)){
表单提交();
}否则{
警告(“文件不是txt文件”);
}
}
});
form.addSubmitCompleteHandler(新的FormPanel.SubmitCompleteHandler(){
@凌驾
SubmitComplete上的公共无效(SubmitCompleteTEvent事件){
if(event.getResults().length()==0){
Window.alert(“出错-重试”);
}否则{
outputText.setText(event.getResults());
}
}
});
VerticalPanel vp=新的VerticalPanel();
副总裁添加(信息);
副总裁添加(文件上传);
vp.add(新HTML(“
”);
vp.add(上传文件BTN);
vp.add(输出文本);
添加表格(vp);
RootPanel rp=RootPanel.get();
rp.add(表格);
}
私有void init(){
form=新的FormPanel();
表单.setAction(上传操作URL);
form.setEncoding(FormPanel.ENCODING\u MULTIPART);
form.setMethod(FormPanel.METHOD_POST);
信息=新标签(“选择txt文件”);
fileupload=新建fileupload();
//在这里,我为文件上传程序添加了一个名称
setName(“上传程序”);
uploadFileBtn=新建按钮(“显示txt文件的内容”);
outputText=新文本区域();
outputText.setEnabled(假);
}
}
在服务器端的Servlet中,我添加了一个检查,检查解析列表是否为空。
我使用路径、名称和文件路径创建文件。然后我用BufferedReader读取文件,并在响应中写入上下文:
public class FileUploadServlet extends HttpServlet
{
private static final long serialVersionUID = 1L;
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Inside doPost");
try {
if (!ServletFileUpload.isMultipartContent(request)) {
throw new FileUploadException("error multipart request not found");
}
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> items = upload.parseRequest(request);
if (items == null) {
response.getWriter().write("File not correctly uploaded");
return;
}
Iterator<FileItem> iter = items.iterator();
while (iter.hasNext()) {
FileItem item = iter.next();
System.out.println("Start writing File");
String uploadPath = ".";
String fileName = new File(item.getName()).getName();
String filePath = uploadPath + File.separator + fileName;
System.out.println("File-Pfad:" + filePath);
File uploadedFile = new File(filePath);
item.write(uploadedFile);
String content = "";
FileReader fileReader = new FileReader(filePath);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String line = null;
while((line = bufferedReader.readLine()) != null) {
content = content + line + "\n";
}
bufferedReader.close();
PrintWriter out = response.getWriter();
response.setHeader("Content-Type", "text/html");
out.println(content);
out.flush();
out.close();
uploadedFile.delete();
System.out.println("Finished reading File");
}
} catch (Exception exc) {
exc.printStackTrace();
PrintWriter out = response.getWriter();
response.setHeader("Content-Type", "text/html");
out.println("Error");
out.flush();
out.close();
}
System.out.println("FileUploadServlet doPost end");
}
}
公共类FileUploadServlet扩展了HttpServlet
{
私有静态最终长serialVersionUID=1L;
@凌驾
受保护的void doPost(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
System.out.println(“内部doPost”);
试一试{
如果(!ServletFileUpload.isMultipartCont