平时在一个网页中下载文件,是可以通过servlet将其上传到网页上的。
因此以下步骤是 利用servlet来上传文件—— 同时在上传附件时也有涉及
准备upload.html(主要用于显示 上传的页面显示):
<!DOCTYPE html>
<meta http-equiv="content-type" content="text/html charset=UTF-8">
//用意是告诉浏览器编码方式是 UTF-8
<head>
<meta charset="UTF-8">
<title>上传文件</title>
</head>
<body>
<form action="uploadPhoto" method="post" enctype="multipart/form-data">
文件名称:<input type="text" name="heroName" /> <br>
上传文件 : <input type="file" name="filepath" /> <br>
<input type="submit" value="上传">
</form>
</body>
</html>
需要注意的是 method的提交方式一定要选择post ,get 不能上传文件enctype=“multipart/form-data” 表示提交的文件是二进制文件
action 则为.xml文件的跳转路径
需要提供type=“file” 的字段进行上传一定要注意type的类型 file才能打开文件栏
和之前的步骤一样 再准备uploadServlet.java
这里需要导入两个jar包,commons-io和commons-fileupload
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.File;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
public class UploadPhotoServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) {//必定重写的方法
String filename = null;
try {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);//主要用到DiskFileItemFactory实例对象放入ServletFileUpload中进行上传文件
// 设置上传文件的大小限制为1M
factory.setSizeThreshold(1024 * 1024);
List items = null;
try {
items = upload.parseRequest(request);//设置List容器来存储请求获取的文件
} catch (FileUploadException e) {
e.printStackTrace();
}
Iterator iter = items.iterator();//迭代器遍历
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (!item.isFormField()) {//如果不是普通文本表单字段
// 这里使用的是一种粗糙的解决文件名重复的办法,即使用时间戳。
filename = System.currentTimeMillis() + ".jpg";
String photoFolder =request.getServletContext().getRealPath("uploaded");
File f = new File(photoFolder, filename);
f.getParentFile().mkdirs();//创建父文件
// 通过item.getInputStream()获取浏览器上传的文件的输入流
InputStream is = item.getInputStream();//直到遍历出Item,一个Item就是对应一个浏览器提交的数据,通过item.getInputStream可以打开浏览器上传的文件的输入流。
// 复制文件
FileOutputStream fos = new FileOutputStream(f);
byte b[] = new byte[1024 * 1024];
int length = 0;
while (-1 != (length = is.read(b))) {
fos.write(b, 0, length);
}
fos.close();
} else {
System.out.println(item.getFieldName());
String value = item.getString();
value = new String(value.getBytes("ISO-8859-1"), "UTF-8");//解码 编码
System.out.println(value);
}
}
//客户端响应
String html = "<img width='200' height='150' src='uploaded/%s' />";//根据临时生成的文件名,创建一个html img元素,然后通过response返回浏览器
response.setContentType("text/html");
PrintWriter pw= response.getWriter();
pw.format(html, filename);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
因为浏览器指定了以二进制的形式提交数据,那么就不能通过常规的手段获取非File字段:
request.getParameter(“heroName”)
在遍历Item时(Item即对应浏览器提交的字段),可以通过
item.isFormField
来判断是否是常规字段还是提交的文件。 当item.isFormField返回true的时候,就表示是常规字段。
然后通过item.getFieldName()和item.getString()就知道分别是哪个字段,以及字段的值了。
以上的上传文件的servlet 基本是作为模板,更多可以了解fileItem类的常用方法——
最后也就是web.xml的配置 很简单在此不赘述
再次经历http500及解决心得——
一般遇到 此类问题 不是servlet那部分的代码写错就是web.xml里的配置出问题
比如 我的servlet的类名是uploadphotoServlet
在写.xml文件时,直接写成:
<servlet-class>uploadphotoServlet </servlet-class>
应该是在uploadphotoServlet前加上包名.
就和写路径一样
这种报的错误都是classNotfound Exception