007

阅读: 评论:0

007

007

input

  • 如果在表单中使用表单元素 ,浏览器在解析表单时,会自动生成一个输入框和一个按钮,输入框可供用户填写本地文件的文件名和路径名,按钮可以让浏览器打开一个文件选择框供用户选择文件:

enctype

  • 当表单需要上传文件时,需指定表单 enctype 的值为 multipart/form-data
  • 在 form 元素的语法中,enctype 属性指定将数据发送到服务器时浏览器使用的编码类型。
  • enctype 属性取值:
    • application/x-www-form-urlencoded:表单 enctype 属性的默认值。这种编码方案使用有限的字符集,当使用了非字母和数字时,必须用”%HH”代替(H 代表十六进制数字)。对于大容量的二进制数据或包含非 ASCII 字符的文本来说,这种编码不能满足要求。
    • multipart/form-data:form 设定了enctype=“multipart/form-data”属性后,表示表单以二进制传输数据
      accept

accept

  • 表示可以选择的文件MIME类型,多个MIME类型用英文逗号分开,常用的MIME类型见下表。
后缀名MIME名称
col 3 isright-aligned
col 2 iscentered
zebra stripesare neat
*.3gppaudio/3gpp, video/3gpp
*.ac3audio/ac3
*.asfallpication/vnd.ms-asf
*.auaudio/basic
*.csstext/css
*.csvtext/csv
*.docapplication/msword
*.dotapplication/msword
*.dtdapplication/xml-dtd
*.dwgimage/vnd.dwg
*.dxfimage/vnd.dxf
*.gifimage/gif
*.htmtext/html
*.htmltext/html
*.jp2image/jp2
*.jpeimage/jpeg
*.jpegimage/jpeg
*.jpgimage/jpeg
*.jstext/javascript, application/javascript
*.jsonapplication/json
*.mp2audio/mpeg, video/mpeg
*.mp3audio/mpeg
*.mp4audio/mp4, video/mp4
*.mpegvideo/mpeg
*.mpgvideo/mpeg
*.mppapplication/vnd.ms-project
*.oggapplication/ogg, audio/ogg
*.pdfapplication/pdf
*.pngimage/png
*.potapplication/vnd.ms-powerpoint
*.ppsapplication/vnd.ms-powerpoint
*.pptapplication/vnd.ms-powerpoint
*.rtfapplication/rtf, text/rtf
*.svfimage/vnd.svf
*.tifimage/tiff
*.tiffimage/tiff
*.txttext/plain
*.wdbapplication/vnd.ms-works
*.wpsapplication/vnd.ms-works
*.xhtmlapplication/xhtml+xml
*.xlcapplication/vnd.ms-excel
*.xlmapplication/vnd.ms-excel
*.xlsapplication/vnd.ms-excel
*.xltapplication/vnd.ms-excel
*.xlwapplication/vnd.ms-excel
text/xml, application/xml
*.zipaplication/zip
*.xlsxapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet

multiple

  • multiple:是否可以选择多个文件,多个文件时其value值为第一个文件的虚拟路径。

Commons-fileupload 组件

  • Commons-fileupload 组件是 Apache 开源代码组织用来处理表单文件上传的一个子项目,该组件性能优异,可以支持任意大小的文件的上传
  • Commons-fileupload 组件从 1.1 版本开始依赖 Apache 的另一个项目:commons-io

Commons-fileupload 组件上传的基本原理

  • FileUpload组件将页面提交的所有元素(普通form表单域,如text和文件域file)都看作一样的FileItem,这样上传页面提交的 request请求也就是一个FileItem的有序组合,FileUpload组件可以解析该request,并返回一个一个的FileItem。而对每一个FileItem,FileUpload组件可以判断出它是普通form表单域还是文件file域,从而根据不同的类型,采取不同的操作。如果是表单域,就读出其值,如果是文件域,就保存文件到服务器硬盘上或者内存中。

Commons-fileupload 组件API

  • 在 Commons-fileupload 组件中,主要用到以下三个接口和类:

  • ServletFileUpload 负责处理上传的文件数据,并将每部分的数据封装到 FileItem 对象中。

  • DiskFileItemFactory 是创建 FileItem 对象的工厂,在这个工厂类中可以配置内存缓冲区大小和存放临时文件的目录。
  • ServletFileUpload 在接收上传文件数据时,会将内容保存到内存缓存区中,如果文件内容超过了 DiskFileItemFactory 指定的缓冲区的大小,那么文件将被保存到磁盘上,存储为 DiskFileItemFactory 指定目录中的临时文件。等文件数据都接收完毕后,ServletUpload 在从文件中将数据写入到上传文件目录下的文件中

测试代码

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ".dtd">
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body><%--基于Apache组件的文件上传:1.导入commons-fileupload-1.2.1.jarcommons-io-2.0.jar2. 其它设置与type="file"一致3. 在servlet中使用这两个jar包进行操作3.1.基本思想:3.1.1.可以解析请求,得到一个FileItem对象组成的List3.1.2.所有的请求斗会封装成一个FileItem对象(文本/文件/……)3.1.3.调用FileItem的isFormField()方法,判断是表单域还是别的(false:表示是一个文件)3.1.4.根据类型获取信息3.2.具体操作3.2.1.得到List<FileItem>3.2.1.1.简单得到// Create a factory for disk-based file itemsFileItemFactory factory = new DiskFileItemFactory();// Create a new file upload handlerServletFileUpload upload = new ServletFileUpload(factory);// Parse the requestList /* FileItem */ items = upload.parseRequest(request);           3.2.1.2.复杂得到(可以设置文件的一些限制和其它属性)// Create a factory for disk-based file itemsDiskFileItemFactory factory = new DiskFileItemFactory();//设置内存中最多可以存放的上传文件的大小, 若超出则把文件写到一个临时文件夹中. 以 byte 为单位factory.setSizeThreshold(yourMaxMemorySize);//设置那个临时文件夹factory.setRepository(yourTempDirectory);// Create a new file upload handlerServletFileUpload upload = new ServletFileUpload(factory);//设置上传文件的总的大小.。也可以设置单个文件的大小.(setFileSizeMax)upload.setSizeMax(yourMaxRequestSize);// Parse the requestList /* FileItem */ items = upload.parseRequest(request);           3.2.2.处理信息              --%><form action="uploadServlet" method="post"  enctype= "multipart/form-data" ><!-- type="file":表示是一个用户文件上传的input标签 -->文件上传:<input type="file" name="file" /><br />信息:<input type="text" name="text" /><br /><input type="submit" value="提交" /></form>     </body>
</html>
package top.itcourse.servlet;import java.io.File;
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.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apachemons.fileupload.FileItem;
import org.apachemons.fileupload.FileUploadException;
import org.apachemons.fileupload.disk.DiskFileItemFactory;
import org.apachemons.fileupload.servlet.ServletFileUpload;public class UploadServlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");//1.得到List<FileItem>//1.1.创建工厂DiskFileItemFactory factory = new DiskFileItemFactory();//1.2.通过工厂设置JVM处理文件大小限制(单位是bytes),当超过这个大小的时候,文件会被写到临时目录下(不然是在内存中处理的)factory.setSizeThreshold(1024 * 500);       //500k//1.3.设置临时目录factory.setRepository(new File("/Volumes/Player/FileDire"));//1.4.创建ServletFileUpload,把工厂对象传进去ServletFileUpload upload = new ServletFileUpload(factory);//1.5.通过ServletFileUpload设置可以上传的文件的总大小(单位bytes),区别开DiskFileItemFactory的setSizeThresholdupload.setSizeMax(1024 * 1024 * 500);//1.6.获得List,调用parseRequest方法List<FileItem> parseRequest = null;OutputStream os = null;InputStream is = null;try {parseRequest  = upload.parseRequest(request);//2.遍历所有的FileItem,确认类型for (FileItem fileItem : parseRequest) {//3.类型为普通表单,打印if( fileItem.isFormField() ) {System.out.println("------------------------------------普通表单---------------------------------------");//3.1.获取普通表单的名字(用的是getFieldName,获取表单的name)String name = FieldName();//3.2.获得这个FileItem的值String value = String();System.out.println(name + " : " + new Bytes("iso-8859-1"),"utf-8"));System.out.println("---------------------------------------------------------------------------");//4.类型为文件类型(非普通表单),保存在指定位置} else {System.out.println("------------------------------------文件---------------------------------------");//input中的nameString fieldName = FieldName();//文件名String fileName = Name();//String contentType = ContentType();//文件大小,单位byteslong sizeBytes = Size();System.out.println("fieldName : " + fieldName);System.out.println("fileName : " + fileName);System.out.println("contentType : " + contentType);//获取文件流,存在相应的目录下is = InputStream();byte[] bytes = new byte[1024];int pos;os = new FileOutputStream(new File("/Volumes/Player/FileDire/Download/" + fileName));while( (pos = is.read(bytes)) != -1 ) {os.write(bytes, 0, pos);}System.out.println("文件上传完毕~~");System.out.println("---------------------------------------------------------------------------");}}} catch (FileUploadException e) {e.printStackTrace();} finally {if( os != null ) {os.close();}if( is != null ) {is.close();}}}
}

效果及完整源码下载

效果及完整源码下载:点击这里

欢迎加入QQ交流群:451826376

本文发布于:2024-02-03 04:44:53,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170690669148731.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:免费的svn空间
标签:
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23