一:实现原理
二:代码实现
jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <!-- jsp 页面部分 --> <!-- 文件上传时必须要设置表单的enctype="multipart/form-data" 让表单中的数据以二进制的方式提交,在servlet中以字节流获取 --> <form action="/fileUpload/UploadFile" method="post" enctype="multipart/form-data"> 请选择图片:<input id="myfile" name="myfile" type="file" /> <input type="submit" value="提交" />${result} </form> </body> </html>
servlet类:
package com.fileupload; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class UploadServlet */ public class UploadServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //从request当中获取流信息 InputStream fileSource = req.getInputStream(); String tempFileName = "E:/tempFile"; //tempFile指向临时文件 File tempFile = new File(tempFileName); //outputStram文件输出流指向这个临时文件 FileOutputStream outputStream = new FileOutputStream(tempFile); byte b[] = new byte[1024]; int n; while(( n = fileSource.read(b)) != -1){ outputStream.write(b, 0, n); } //关闭输出流、输入流 outputStream.close(); fileSource.close(); //获取上传文件的名称 RandomAccessFile randomFile = new RandomAccessFile(tempFile,"r"); randomFile.readLine(); String str = randomFile.readLine(); System.out.println(str); int beginIndex = str.lastIndexOf("\\") + 1; int endIndex = str.lastIndexOf("\""); String filename = str.substring(beginIndex, endIndex); System.out.println("filename:" + filename); //重新定位文件指针到文件头 randomFile.seek(0); long startPosition = 0; int i = 1; //获取文件内容 开始位置 while(( n = randomFile.readByte()) != -1 && i <=4){ if(n == '\n'){ startPosition = randomFile.getFilePointer(); i ++; } } startPosition = randomFile.getFilePointer() -1; //获取文件内容 结束位置 randomFile.seek(randomFile.length()); long endPosition = randomFile.getFilePointer(); int j = 1; while(endPosition >=0 && j<=2){ endPosition--; randomFile.seek(endPosition); if(randomFile.readByte() == '\n'){ j++; } } endPosition = endPosition -1; //设置保存上传文件的路径 String realPath = "E:/图片"; System.out.println(realPath); File fileupload = new File(realPath); if(!fileupload.exists()){ fileupload.mkdir(); } File saveFile = new File(realPath,filename); RandomAccessFile randomAccessFile = new RandomAccessFile(saveFile,"rw"); //从临时文件当中读取文件内容(根据起止位置获取) randomFile.seek(startPosition); while(startPosition < endPosition){ randomAccessFile.write(randomFile.readByte()); startPosition = randomFile.getFilePointer(); } //关闭输入输出流、删除临时文件 randomAccessFile.close(); randomFile.close(); tempFile.delete(); req.setAttribute("result", "上传成功!"); RequestDispatcher dispatcher = req.getRequestDispatcher("jsp/FileUpload.jsp"); dispatcher.forward(req, resp); } }
三:总结
在jsp页面中,通过设置form表单的enctype="multipart/form-date"提交,在servlet中最关键的一步就是通过InputStream fileSource = req.getInputStream();来以获取请求的字节流。然后通过字节流将获取的信息保存到一个临时文件下面,因为获取到的信息不都是所需要的。然后再选择需要的信息。