servlet+jsp上传过程(学习记录)
来源:互联网 发布:网络布线设计费怎么算 编辑:程序博客网 时间:2024/04/29 18:17
前段jsp代码(简单的表单):
<form action="${pageContext.request.contextPath}/Upload" enctype="multipart/form-data" method="post"> 上传用户:<input type="text" name="username"><br> 上传文件:<input type="file" name="filename"><br> <input type="submit" value="上传"><br> </form>
后台servlet代码
需要导入commoms-fileupload和commoms-io包.
package lxb.upload;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
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.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* Servlet implementation class Upload
*/
public class Upload extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { //设置编码格式 response.setCharacterEncoding("utf-8"); response.setContentType("text/html ; charset=utf-8"); try { //设置上传文件类型 List<String> allowList = Arrays.asList(".jpg", ".avi", ".MOV"); DiskFileItemFactory factory = new DiskFileItemFactory(); //设置缓冲大小和缓冲目录 factory.setSizeThreshold(1024*1024); factory.setRepository(new File("d:\\2345\\")); //创建上传解析器 ServletFileUpload upload = new ServletFileUpload(factory); //判断文件是否为普通文件 if (!upload.isMultipartContent(request)) { return; } //设置最大文件上传 upload.setSizeMax(1024*1024*5); //设置上传文件监听器 upload.setProgressListener(new ProgressListener() { private int count = 0; public void update(long pBytesRead, long pContentLength, int pItems) { if (pBytesRead / (1024 * 1024) > count) { count++; System.out.println("已经解析了:" + count + "m了"); } } }); //解决文件名乱码问题 upload.setHeaderEncoding("UTF-8"); //解析上传文件 List<FileItem> list = upload.parseRequest(request); //得到表单上传的每个文件 for (FileItem file : list) { //判断是否为普通表单类型 if (file.isFormField()) { String name = file.getFieldName(); //对表单传来的中文解析,解决乱码问题 //value = new String(value.getBytes("iso8859-1"), "UTF-8");(这种也可以) String value = file.getString("UTF-8"); System.out.println(name+".........."+value); }else{ //得到文件名 String fileName = file.getName(); //判断是否支持文件类型 if (!allowList.contains(fileName.substring(fileName.lastIndexOf(".")))) { PrintWriter out = response.getWriter(); out.println("不支持文件类型"); return; } //生成随机目录和随机文件名 String path = makeName(fileName); //文件流的传输, InputStream is = file.getInputStream(); OutputStream os = new FileOutputStream(new File(path)); int len = 0; byte[] buff = new byte[1024]; while ((len = is.read(buff)) > 0) { os.write(buff, 0, len); os.flush(); } //关流很重要,输入流也要关,要不然删不掉临时文件,卡了很久才发现, is.close(); os.close(); //删除临时文件 file.delete(); } } //提示 request.getRequestDispatcher("/message.jsp").forward(request, response); } catch (FileUploadException e) { request.getRequestDispatcher("message.jsp").forward(request, response); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ServletException e) { e.printStackTrace(); }}//生成随机文件路径和文件名private String makeName(String fileName) { int one = fileName.hashCode(); one = one & 15; int two = fileName.hashCode(); two = (two >> 4) & 15; String path = "d:\\2345\\" + one + File.separator + two + File.separator; File file = new File(path); if (!file.exists()) { file.mkdirs(); } return path + File.separator + UUID.randomUUID().toString() + fileName;}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response);}
}
总结
自己写代码才会发现很多问题,看着很简单的一个功能写了一天多,总算把功能基本写出来了。
不过还是有个问题没有解决,在设置了上传文件限制为5M后,如果上传超过5M的文件会提示访问页面出错,并且会发送多次请求,后台也不报错,先做一下记录,以后有能力在解决吧。
- servlet+jsp上传过程(学习记录)
- 我的servlet学习过程(四):JSP部分
- Web学习-jsp实现servlet过程赏析
- JSP&&SERVLET学习笔记(七):Servlet处理上传的文件
- Servlet&JSP (三)上传和下载
- Android+Servlet图片上传 (Tomcat+jsp)
- JSP+servlet上传文件
- JSP+SERVLET实现“上传”
- jsp servlet文件上传
- jsp+servlet图片上传
- jsp servlet文件上传
- jsp+servlet文件上传
- jsp servlet 上传文件
- JSP Servlet 上传
- jsp/servlet文件上传
- jsp+Servlet实现上传
- jsp/servlet上传文件
- JSP +Servlet 文件上传
- 支持向量机专题——线性可分支持向量机
- <VB6.0 & android开发小工具> 桌面帮助程序 里面涉及到的代码
- 9-2(找规律,思路,
- oCam Pre v416.0 体积小的屏幕录制工具绿色破解版
- 教你卸载Mac应用软件,提升您的Mac运行速度
- servlet+jsp上传过程(学习记录)
- 系统调用的前因后果
- TSP问题求解方法
- 第一章:绪论
- 百度地图的覆盖物自定义(二)--信息窗口的自定义(调用白茹提供的信息窗口InfoWindow)
- Codeforces Round #431 (Div. 2) A Odds and Ends
- CentOS 上安装 Apache Hadoop!
- 【Unity Shader实战】利用凹凸纹理和边缘光模拟全息投影的效果
- CentOS 上安装 Apache Hadoop!