概述:在以前写项目时,简单的认为设计表单时只要把上传文件的type属性改为即可"file",但是在今天做一个商品信息的图片添加的项目时发现选择图片可以实现,但当点击保存后查看数据库时此时的数据库并没有存储进去照片,所以为了解决这个问题,学习了相关的文件上传原理。
一、具体分析:
1、客户端编码:
二、服务器端怎样获得上传的文件?
1、通过request获得请求体的内容
2、解析请求体:根据分隔符将请求体的文本内容分割成数组,数组中的每一部分是一 个表单项
3、遍历数组,分清楚哪个是普通表单项,哪个是文件.上传项
4、普通表单项:username= zhangsan
5、文件上传项:filename= "aaaa.txt" 文件的内容使用io将文件的内存存到服务器上
三、使用方便快捷的文件上传的工具
必须导入
四、代码实现
前台就不用说了,分析一有,主要展示服务层,即servlet
package servlet; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.List; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; 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; /** * Servlet implementation class File */ @WebServlet("/File") public class File extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public File() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub try { //接受上传文件 //1、创建磁盘文件项工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); //2、创建文件上传的核心类 ServletFileUpload upload = new ServletFileUpload(factory); //3、解析request---获得文件项集合 List<FileItem> parseRequest = upload.parseRequest(request); //4、遍历文件项集合 for(FileItem item : parseRequest){ //5、判断普通表单项/文件上传项 boolean formField = item.isFormField();//是否是一个普通表单项 if(formField){ //普通表单项 String fieldName = item.getFieldName(); String fieldValue = item.getString(); System.out.println(fieldName+":"+fieldValue); }else{ //文件上传项 //获得上传文件的名称 String fileName = item.getName(); //获得上传文件的内容 InputStream in = item.getInputStream(); //将in中的数据拷贝服务器上 String path = this.getServletContext().getRealPath("upload"); OutputStream out = new FileOutputStream(path+"/"+fileName); int len = 0; byte[] buffer = new byte[1024]; while((len=in.read(buffer))>0){ out.write(buffer, 0, len); } in.close(); out.close(); } } } catch (FileUploadException e) { e.printStackTrace(); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
五、实现结果
如果没有在项目的本地文件夹没有找到上传的文件,请参考https://blog.csdn.net/Sky_rabbit94/article/details/81063994
六:补充相关方法