ENCTYPE="multipart/form-data">
这个设置好像不是这样的
是enctype="application/x-www-form-urlencoded"
而且 如果你设置了这个,这个form的其他数据在后台就获取不到了。我介意你把上传于数据提交分开
这个设置好像不是这样的
是enctype="application/x-www-form-urlencoded"
而且 如果你设置了这个,这个form的其他数据在后台就获取不到了。我介意你把上传于数据提交分开
解决方案 »
- iWebOffice中间件
- 将Image对象赋值给src
- 函数为什么没有执行
- jsp中如何向SQL Server数据库中存储和读取word文件?
- Read of HTTP Request POST parameters failed: Connection reset 是什么原因
- 各位帮我看看问题出在哪?急啊!(马上要答辩了)
- 新年提个旧问题,关于在JSP页面之间跳转的。
- 请问Linux (x86/Motif)与 Linux (x86/GTK 2)有什么不一样?
- 帮忙帮忙,给分了!!
- jsp 写完执行的时候跑出空指针错误,显示
- 请问java web 和javaEE什么关系
- servlet客户提交速度的限制
upload.jsp
<form action="./uploadAction!upload" method="post" enctype="multipart/form-data"> <input type="file" name="upload"/><br/> <input type="submit" value="上传"/> </form> struts.xml <action name="uploadAction" class="com.xiaobei.ssh.www.upload.UploadAction"> <param name="saveDir">D:/Apache/Tomcat6.0/webapps/struts2/upload/uploadfile/</param> <result name="uploadUI">/upload/uploadUI.jsp</result> <result name = "fileList">/upload/fileList.jsp</result> </action>UploadAction.java
package com.xiaobei.ssh.www.upload;import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;import com.opensymphony.xwork2.ActionSupport;public class UploadAction extends ActionSupport{
private String contentType;
private File upload;
private String fileName;
private String caption;
private String saveDir;public File getUpload() {
return upload;
}public void setUpload(File upload) {
this.upload = upload;
}public String getSaveDir() {
return saveDir;
}public void setSaveDir(String saveDir) {
this.saveDir = saveDir;
}public String getContentType() {
return contentType;
}public void setContentType(String contentType) {
this.contentType = contentType;
}public String getUploadFileName() {
return fileName;
}public void setUploadFileName(String fileName) {
this.fileName = fileName;
}public String getCaption() {
return caption;
}public void setCaption(String caption) {
this.caption = caption;
}public String uploadUI() throws Exception{
return "uploadUI";
} public String upload() throws Exception {
FileInputStream fis = new FileInputStream(this.upload);
FileOutputStream fos = new FileOutputStream(this.saveDir+this.fileName);
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
int i=0;
while((i=bis.read())!=-1){
bos.write(i);
}
bos.flush();
fos.flush();
bos.close();
fos.close();
bis.close();
fis.close();
return "fileList";
} }
1.1新建一个文件上传表单
新建一个form,method设置成post,enctype设置成multipart/form-data,如下图所示。
图18 文件上传的表单
1.2编写Servlet
编写一个Servlet,完成文件上传功能,主要遵循一下几个步骤。
// 1、Create a factory for disk-based file items
FileItemFactory factory = new DiskFileItemFactory();// 2、Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);// 3、Parse the request
List /* FileItem */ items = upload.parseRequest(request);// 4、Process the uploaded items
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next(); if (item.isFormField()) {
processFormField(item);
} else {
processUploadedFile(item);
}
}// 5、Process a regular form field
if (item.isFormField()) {
String name = item.getFieldName();
String value = item.getString();
...
}// 6、Process a file upload
if (!item.isFormField()) {
String fieldName = item.getFieldName();
String fileName = item.getName();
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();
...
}
表单中的表单域和文件上传都是以FileItem的形式提交过来的,所以需要判断是普通的表单域还是文件上传,然后分别处理。FileItem提供了isFormField方法来实现这个功能。在文件上传的分支里调用FileItem的write方法即可简便的实现文件上传功能。
Write是一个较高级的封装,如果我们想要完成更精细的控制,需要获得OutputStream对象和InputStream对象,然后进行IO操作,完成文件上传。但是利用这个方法会产生临时文件,其实这些临时文件是FileItem 产生的。我们只需在处理完FileItem后调用FileItem的delete方法将其删除。也可以通过FileCleanerCleanup监听器来清理临时文件,详见http://commons.apache.org/fileupload/using.html