文件上传的步骤:
1.目前Java文件上传功能都是依靠Apache组织的commons-io,
fileupload两个包来实现的;2. http://commons.apache.org/下载io,fileupload包
添加到项目中的WEB-INF/lib文件夹下;3.文件上传的时候文件一般是存在服务器的upload目录下,文件名称
存储在数据库中,为了防止上传的文件同名,我们需要动态的 修改上传文件的名称。 4.必须设计form表单类型为(请求方式为:post请求,添加属性enctype = multipart/form-data),这样这个form 才能够支持文件上传5.以下是具体项目的一个Servlet类,目的:把文件上传同增添功能同时进行
具体代码如下:
package com.jinzhi.web;
import java.io.File;
import java.io.IOException;import java.io.PrintWriter;import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.List;import java.util.UUID;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.FileUploadException;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;
import com.jinzhi.bean.Book;
import com.jinzhi.bean.BookType;import com.jinzhi.dao.BookDao;import com.jinzhi.dao.BookTypeDao;public class BookSave extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8"); BookTypeDao booktypeDao = new BookTypeDao(); List<BookType> lst = booktypeDao.findAll(); request.setAttribute("lstBookType", lst); request.getRequestDispatcher("book_save.jsp").forward(request, response); }public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置请求的编码格式
request.setCharacterEncoding("utf-8");
//设置响应的编码格式
response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); //备以封装从FileItem集合中取出的页面元素的数据 Book book = new Book(); //为了转换从fileItem集合中取出的日期的格式 DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); //得到文件上传的目录(存到本地磁盘) String savePath = request.getSession().getServletContext().getRealPath("/upload"); //创建本地磁盘文件工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); //创建文件上传解析器 ServletFileUpload sf = new ServletFileUpload(factory); //设置解析器的大小(一次可以解析多少文件) sf.setFileSizeMax(1024*1024); //现在所有表单元素都要通过解析器解析,所以要设置解析的编码格式 sf.setHeaderEncoding("utf-8"); String fileName = "";//文件名称 //将得到前台所有的form表单元素,从request对象得到所有的表单元素对象 try { //fileItem代表完整的input对象,而不是其他的东西(例如value值) List<FileItem> list = sf.parseRequest(request); //循环前台得到的input对象数据,判断是一般表单数据还是上传文件类型数据 for (FileItem fileItem : list) { if(fileItem.isFormField()) { //判断为普通的表单数据 //System.out.println(fileItem.getFieldName() + fileItem.getName()); //bookName为前台页面input元素起的name值 if("bookName".equals(fileItem.getFieldName())) { //加参数的String设置得到的值的编码格式 book.setBookName(fileItem.getString("utf-8")); } if("author".equals(fileItem.getFieldName())) { book.setAuthor(fileItem.getString("utf-8")); } if("pbName".equals(fileItem.getFieldName())) { book.setPbName((fileItem.getString("utf-8"))); } if("context".equals(fileItem.getFieldName())) { book.setContext((fileItem.getString("utf-8"))); } if("price".equals(fileItem.getFieldName())) { book.setPrice(Double.parseDouble(fileItem.getString("utf-8"))); } if("hyprice".equals(fileItem.getFieldName())) { book.setHyprice(Double.parseDouble(fileItem.getString("utf-8"))); } //int类型 if("booktypeId".equals(fileItem.getFieldName())) { book.setBooktypeId(Integer.parseInt(fileItem.getString("utf-8"))); } if("bookstate".equals(fileItem.getFieldName())) { book.setBookStates(Integer.parseInt(fileItem.getString("utf-8"))); } if("num".equals(fileItem.getFieldName())) { book.setNum(Integer.parseInt(fileItem.getString("utf-8"))); } if("pbDate".equals(fileItem.getFieldName())) { //由格式化后的日期格式解析为格式化前的格式 book.setPbdate(df.parse(fileItem.getString("utf-8"))); } if("sjDate".equals(fileItem.getFieldName())) { //由格式化后的日期格式解析为格式化前的格式 book.setSjdate(df.parse(fileItem.getString("utf-8"))); } } else { //判断为文件类型 System.out.println(fileItem.getFieldName() + fileItem.getName()); //得到文件名称 String filename = fileItem.getName(); //因为防止两次上传文件的名称相同,而导致覆盖旧文件,所以要修改名称,新文件名称 //这里是新加的文件前缀(生成的随机数,拼成的文件前缀) //这里是旧文件的后缀 fileName = UUID.randomUUID().toString() + filename.substring(filename.lastIndexOf(".")); //构建文件 File file = new File(savePath + "/" + fileName); //写入内容 fileItem.write(file); book.setBigImg(fileName); } } } catch (FileUploadException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }//调用DAO存入数据库
new BookDao().save(book); response.sendRedirect("BookList"); out.flush(); out.close(); }}