在jsp+servlet的项目中需要使用图片上传的功能,如果不把图片放在服务器上的话,每次都要从本机取出来,不能达到想要的效果,使用commons.fileupload和commons.io可以完成这个功能,
使用<input type="file">
这个控件来选择要上传的图片,如图:
然后来说下怎么将选中的图片上传到服务器中,这里先要将commons.fileupload和commons.io的jar包添加到lib下,
注意:使用时要在form处添加属性enctype=”multipart/form-data”,否则会报一个异常出来.
之后在servlet中写添加图片的具体方法:
public void doProAddWithFile(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
// DiskFileItemFactory FileItem 对象的工厂,可以设定缓冲区大小和存放临时文件目录
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置内存缓冲区的大小为11k
factory.setSizeThreshold(11 * 1024);
// 指定保存上传文件的临时文件夹,自己定义
File f = new File("F://tempDirectory");
// setRepository方法用于设置当上传文件尺寸大于setSizeThreshold方法设置的临界值时,将文件以临时文件形式保存在磁盘上的存放目录。
factory.setRepository(f);
// 创建ServletFileUpload的实例
ServletFileUpload sfu = new ServletFileUpload(factory);
sfu.setHeaderEncoding("UTF-8");
// 设置单个上传文件的最大值为6M,该数据以字节为单位
sfu.setFileSizeMax(6000 * 1024);
try {
// 得到所有的输入项(每个控件)的集合
List<FileItem> items = sfu.parseRequest(request);
// 创建一个product对象
Product pro = new Product();
for (FileItem fileItem : items) {
// isFormField()为true表示当前控件是普通控件,为false表示它是上传控件
if (fileItem.isFormField()) {
// 获取控件的名称,即每个请求参数的名称
String name = fileItem.getFieldName();
// 获取控件的值,加UTF-8防止中文乱码
String value = fileItem.getString("UTF-8");
// 对控件名即请求参数进行判断,依次封装到一个Product对象的属性中
if (name.equals("serialNumber")) {
pro.setPro_id(Integer.parseInt(value));
} else if (name.equals("name")) {
pro.setPro_name(value);
} else if (name.equals("brand")) {
pro.setPro_brand(value);
} else if (name.equals("model")) {
pro.setPro_version(value);
} else if (name.equals("price")) {
pro.setPro_price(Long.parseLong(value));
} else if (name.equals("description")) {
pro.setPro_introduce(value);
}
} else {
// 分析上传文件的数据
// 获取上传文件的名称
String fileName = fileItem.getName();
// 获取上传文件的文件类型
String contentType = fileItem.getContentType();
// 获取上传文件的大小
long size = fileItem.getSize();
// 获取当前web应用根目录的绝对路径(Tomcat服务器部署工程的绝对路径)
String path = this.getServletContext().getRealPath("/");
// 获取保存上传文件的全路径
String filePath = path + "images/" + fileName;
// 获取封装了上传文件数据的输入流
InputStream is = fileItem.getInputStream();
// 输出流
OutputStream os = new FileOutputStream(filePath);
// 输出文件
int len = 0;
byte[] b = new byte[1024];
while ((len = is.read(b)) != -1) {
os.write(b, 0, len);
}
// 关闭流
os.close();
is.close();
// 上传成功后,删除临时文件
fileItem.delete();
// 设置图片保存的相对路径,这是要存到数据库中的
pro.setPro_image("images/" + fileName);
}
}
要先在服务器所在的路径下新建一个images文件夹,否则会出现找不到文件的异常,
这样就把选择的图片上传到web应用所在的服务器的文件夹下了,在数据库中只需要存它的相对路径就可以了.