一、文件上传的基本操作:
1、 表单属性enctype的设置 multipart/form-data和application/x-www-form-urlencoded的区别 <!-- 编写文件上传表单 1、提供文件上传输入项 <input type="file" /> 2、input file 必须提供name 属性(没有name 属性表单项,不会提交)value可以重复但是必须得有 3、表单method属性 必须post(GET提交方式,提交数据有长度限制,上传文件可能会很大) 4、form的enctype属性 必须设置 multipart/form-data --> FORM元素的enctype属性指定了表单数据向服务器提交时所采用的编码类型,默认的缺省值是“application/x-www-form-urlencoded”。 然而,在向服务器发送大量的文本、包含非ASCII字符的文本或二进制数据时这种编码方式效率很低。 在文件上传时,所使用的编码类型应当是“multipart/form-data”,它既可以发送文本数据,也支持二进制数据上传。 Browser端<form>表单的ENCTYPE属性值为multipart/form-data,它告诉我们传输的数据要用到多媒体传输协议,由于多媒体传输的都是大量的数据,所以规定上传文件必须是post方法,<input>的type属性必须是file。 要获取提交过来的数据可以用request.getInputstream()再放到输出流输出发现输出的是 -----------------------------7dd32c39803b2 wzhting aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbb 这样的话得分割比较麻烦所以apache开发了上传工具 导入apache的两个jar:commons-fileupload.jar和commons-io.jar
DiskFileItemFactory:设置环境-》ServletFileUpload:核心上传类(主要作用:解析请求的正文内容)-》FileItem:代表表单中的一个输入域。
DiskFileItemFactory:
public void setSizeThreshold(int?sizeThreshold) :设置缓冲区大小。默认是10Kb。
当上传的文件超出了缓冲区大小,fileupload组件将使用临时文件缓存上传文件 public void setRepository(java.io.File repository):设置临时文件的存放目录。默认是系统的临时文件存放目录。 DiskFileItemFactory(int size,File file);
ServletFileUpload:
boolean isMultipartContent(HttpServletRequest?request):判断用户的表单的enctype是否是multipart/form-data类型的。
List parseRequest(HttpServletRequest request):解析请求正文中的内容返回List<FileItem> setFileSizeMax(4*1024*1024);//设置单个上传文件的大小 upload.setSizeMax(6*1024*1024);//设置总文件大小 FileItem
1.获取普通字段信息: boolean isFormField():是否是普通字段
String getFieldName:获取普通字段的字段名 String getString():获取普通字段的值 2.获取上传文件信息: InputStream getInputStream():获取上传字段的输入流 String getName():获取上传的文件名 最普通的文件上传:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;utf-8"); response.setCharacterEncoding("utf-8"); DiskFileItemFactory factory=new DiskFileItemFactory(); ServletFileUpload load=new ServletFileUpload(factory); load.setHeaderEncoding("UTF-8"); if(!load.isMultipartContent(request)){ return; } try { List<FileItem> list=load.parseRequest(request); for(FileItem item: list){ if(item.isFormField()) { String name=item.getFieldName(); String value=item.getString("utf-8"); response.getWriter().write(name+"="+value); } else { String real=getServletContext().getRealPath("/WEB-INF/upload"); String filename=item.getName(); filename=filename.substring(filename.lastIndexOf("\\")+1); response.getWriter().write("<br />文件名:"+filename); FileOutputStream fos=new FileOutputStream(real+"\\"+filename); InputStream ins=item.getInputStream(); byte buf[]=new byte[1024]; int len=0; while((len=ins.read(buf))>0){ fos.write(buf,0,len); } ins.close(); fos.close(); } } } catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } 要注意的9个问题
完整文件上传代码:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8");// 中文文件名乱码问题 response.setContentType("text/html;charset=UTF-8"); PrintWriter pout = response.getWriter(); DiskFileItemFactory df = new DiskFileItemFactory(1024 * 1024, new File( "d:" + File.separator + "cache")); ServletFileUpload sfu = new ServletFileUpload(df); if (!sfu.isMultipartContent(request)) { System.out.println("提交类型不对"); } else { try { //进度条 /* sfu.setProgressListener(new ProgressListener() { //pBytesRead读取的字节数 pContentLength总长度 pItems读取了第几个 public void update(long pBytesRead, long pContentLength, int pItems) { // TODO Auto-generated method stub System.out.println("已读取:"+pBytesRead+",文件大小:"+pContentLength+",第几项:"+pItems); } });*/ List<FileItem> list = sfu.parseRequest(request); // sfu.setFileSizeMax(4 * 1024 * 1024);// 设置单个上传文件的大小 // sfu.setSizeMax(6 * 1024 * 1024);// 设置总文件大小 for (FileItem item : list) { if (item.isFormField()) { System.out.println(item.getFieldName() + ":" + item.getString("utf-8"));// form表单参数乱码问题 } else { String mimeType = item.getContentType(); // if (mimeType.startsWith("image")) if (1 == 1) {// 限制上传文件类型只能为图片 String fileName = item.getName(); if (fileName == null || "".equals(fileName.trim())) {// 多个文件上传时,没有上传内容的问题 continue; } fileName = fileName.substring(fileName .lastIndexOf("\\") + 1); String storePath = getServletContext().getRealPath( "/WEB-INF/Files"); InputStream is = item.getInputStream(); fileName = UUID.randomUUID() + "_" + fileName;// 防止文件名重复 storePath = makeStorePath(storePath, fileName);// 多文件夹存储 OutputStream fos = new FileOutputStream(storePath + File.separator + fileName); BufferedOutputStream out = new BufferedOutputStream( fos); byte b[] = new byte[1024]; int len = -1; while ((len = is.read(b)) != -1) { out.write(b, 0, len); } is.close(); out.close(); item.delete();//必须关闭is和out后删除临时文件 } } } } /*catch (org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException e) { // 单个文件超出大小时的异常 pout.write("单个文件大小不能超出4M"); } catch (org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException e) { // 总文件超出大小时的异常 pout.write("总文件大小不能超出6M"); } */catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } response.sendRedirect("/ServletFileUpload/ok.jsp"); } } private String makeStorePath(String storePath, String fileName) { // TODO Auto-generated method stub int hashCode = fileName.hashCode(); int dir1 = hashCode & 0xf;// 0000~1111:整数0~15共16个 int dir2 = (hashCode & 0xf0) >> 4;// 0000~1111:整数0~15共16个 String newstore = storePath + File.separator + dir1 + File.separator + dir2; File file = new File(newstore); if (!file.exists()) { file.mkdirs();// 递归创建目录 } return newstore; }
ok
|
- 浏览: 69963 次
- 性别:
相关推荐
jspservlet文件上传实例 java 上传
jsp与servlet文件上传代码,可以上传中文文件名,不乱码 jsp与javaBean文件上传代码,但上传中文文件名乱码 刚写完的。
JSP+servlet文件上传简单案例 JSP+servlet文件上传简单案例
jsp servlet 上传例子 jspsmartupload jsp servlet 上传例子 jspsmartupload jsp servlet 上传例子 jspsmartupload
实现简单的文件上传功能。 在工程中加入io和upload组件的方法: Windows-preferences-Java-buildpath-userlibraries 右击工程名:buildpath-config buildpath-libraries-addlibraries-userliraries-next,加入包即可...
工具:netbeans6.5 服务器:glassfish v2 技术:jsp+servlet 功能:上传图片(gif,jpg)(不能上传exe,bat)
本文实例为大家分享了JSP+Servlet实现文件上传到服务器功能的具体代码,供大家参考,具体内容如下 项目目录结构大致如下: 正如我在上图红线画的三个东西:Dao、service、servlet 这三层是主要的结构,类似 MVC ...
【摘要】:该文介绍了在B/S模式下,通过JSP/Servlet技术实现文件上传的方法。 文件上传在很多网站应用中是必不可少的,在电子商务中上传商品图片,在音乐网站中上传流行歌曲……一个高效率的文件上传功能尤为重要。...
完整的JSP+Servlet实现文件的上传下载
jsp+servlet文件上传数据库和下载
纯jsp+servlet实现文件上传,没有使用apache上传组件
是jsp和servlet合作实现了对文件的上传
主要介绍了简单操作实现Java jsp servlet文件上传过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
页面+处理的SERVLET代码 需要jspSmartUpload组件
jsp servlet 通过ajax 实现上传文件的同时获取文件上传进度
JSP+servlet文件上传 rar格式
servlet jsp javabean 实现的文件上传
可以实现jsp文件上传。
JSP/servlet实现上传下载 JSP/servlet实现上传下载 JSP/servlet实现上传下载 JSP/servlet实现上传下载