2021SC@SDUSC
- MultipartConfigurationHelper.java
- 1、总结
- 2、主要属性
- 3、方法
- MultipartFilter
- 1、总结
- 2、主要属性
- 3、方法
- MultipartParser.java
- 1、总结
- 2、构造器
- 3、方法
- 4、其他
继承自object
多部分过滤器的配置对象
2、主要属性protected String uploadDirectory;
- 这个参数允许指定 Cocoon 应该把上传的文件放在哪里。指定的路径可以是绝对的,也可以是相对于 servlet 的上下文路径。 在windows平台上,绝对目录必须以volume开头:C:PathToUploadDirectory
protected boolean enableUploads;
- 使多部分请求中的所有文件都得到处理,出于安全原因,默认值为 false
protected boolean autosaveUploads; - 使多部分请求中的所有文件都保存到上传目录,出于安全原因,默认值为 true
protected String overwriteUploads;
- 指定在将上传的文件保存到磁盘时处理名称冲突。可接受的值为拒绝、允许、重命名(默认)。文件被重命名为 x_filename,其中 x 是一个整数值,递增以使新文件名唯一
protected int maxUploadSize;
- 指定允许的最大上传大小,默认为 10 Mb
给上述每个参数配备get和set方法,以autosaveUploads为例:
public boolean isAutosaveUploads()
- 返回参数autosaveUploads
public void setAutosaveUploads(boolean autosaveUploadsValue)
- 设置参数autosaveUploads
public void configure(Settings settings, Log logger)
- 从设置对象进行配置
继承自AbstractLogEnabled
实现了Filter接口
//负责包装多部分编码的表单并处理传入请求的文件负载 protected RequestFactory requestFactory; //底层cocoon BeanFactory protected BeanFactory cocoonBeanFactory; //底层设置 protected Settings settings; //特殊的 servlet 设置 protected ServletSettings servletSettings; //Servlet前后关系 protected ServletContext servletContext;3、方法
实现filter接口
public void init(FilterConfig config) throws ServletException
- 由 Web 容器调用以向过滤器指示它正在投入使用。 servlet 容器在实例化过滤器后只调用一次 init 方法。在要求过滤器执行任何过滤工作之前,init 方法必须成功完成
- Web 容器无法将过滤器投入使用如果 init 方法 :
1.抛出一个ServletException
2.在web容器定义的时间段内不返回
public void destroy()
- 由 Web 容器调用以向过滤器指示它正在停止服务。 只有在过滤器的 doFilter()方法中的所有线程都退出或超时时间过后,才会调用此方法。
- Web 容器调用此方法后,将不会在此过滤器实例上再次调用 doFilter()方法
- 此方法使过滤器有机会清理任何被占用的资源(例如,内存、文件句柄、线程)并确保任何持久状态与过滤器在内存中的当前状态同步
public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException
- 由于客户端对链尾资源的请求,每次请求/响应对通过链时,容器都会调用 Filter 的 doFilter 方法。 传入此方法的 FilterChain 允许 Filter 将请求和响应传递给链中的下一个实体。
- 此方法的典型实现将遵循以下模式:
- 检查请求
- 可选地使用自定义实现包装请求对象以过滤内容或标题以进行输入过滤
- 可选地使用自定义实现包装响应对象以过滤内容或标题以进行输出过滤
- a) 要么使用 FilterChain 对象(chain.doFilter())调用链中的下一个实体
- b) 或不将请求/响应对传递给过滤器链中的下一个实体以阻止请求处理
- 调用过滤器链中的下一个实体后,直接在响应上设置标头
补充:filter接口
- 过滤器是一个对象,它对资源(servlet 或静态内容)的请求或来自资源的响应或两者执行过滤任务。
- 过滤器在 doFilter 方法中执行过滤。 每个过滤器都可以访问一个 FilterConfig 对象,它可以从中获取其初始化参数,一个对 ServletContext 的引用,它可以使用它来加载过滤任务所需的资源
- 过滤器在 Web 应用程序的部署描述符中配置
继承自object
此类用于实现多部分请求包装器
它将解析 http post 流并用值填充它的哈希表
哈希表包含:①Vector:内联部分值 ②FilePart:文件部分
MultipartParser( //将文件部分写入uploadDirectory。 如果为 true,则哈希表中的相应对象将包含一个 FilePartFile,如果为 false,则为 FilePartArray boolean saveUploadedFilesToDisk, //如果 saveUploadedFilesToDisk 为真,则要写入的目录 File uploadDirectory, //允许覆盖现有文件 boolean allowOverwrite, //文件是否存在重命名文件(使用文件名+编号) boolean silentlyRename, //接受的最大内容长度 int maxUploadSize, //要使用的字符编码 String characterEncoding)3、方法
public Hashtable getParts(HttpServletRequest request) throws IOException, MultipartException
- 将来自请求 URI 的所有参数复制到部件表,上传进度条支持
private Hashtable readHeaders(TokenStream in) throws IOException
- 读取部分标题
- headers.put 中的额外 tokenizer.hasMoreTokens() 处理 IE6 为空上传字段提交的 filename="" 情况
private String getBoundary(String hdr)
- 从内容标题获取边界
private String readln(TokenStream in) throws IOException
- 读取字符串直到换行或流结束
private void parseMultiPart(TokenStream ts, String boundary) throws IOException, MultipartException { ts.setBoundary(boundary.getBytes()); //读取第一个边界 ts.read(); //设置要扫描的边界 ts.setBoundary(("rn" + boundary).getBytes()); //调用getState()返回流状态,当 state 为 STATE_NEXTPART 时,从新部分的开始起阅读流 while (ts.getState() == TokenStream.STATE_NEXTPART) { //阅读流中的下一部分 ts.nextPart(); //调用parsePart()解析单个部分 parsePart(ts); } //安全性检查 if (ts.getState() != TokenStream.STATE_ENDMULTIPART) { throw new MultipartException("Malformed stream"); } }
补充:getBytes()方法
使用平台的默认字符集将此 String 编码为字节序列,并将结果存储到新的字节数组中。
当此字符串无法在默认字符集中编码时,此方法的行为未指定。 当需要对编码过程进行更多控制时,应使用 java.nio.charset.CharsetEncoder 类
哈希表:也叫散列表,哈希表是一种数据结构,它提供了快速的插入 *** 作和查找 *** 作,无论哈希表总中有多少条数据,插入和查找的时间复杂度都是为O(1),因为哈希表的查找速度非常快,所以在很多程序中都有使用哈希表
哈希表也有自己的缺点,哈希表是基于数组的,我们知道数组创建后扩容成本比较高,所以当哈希表被填满时,性能下降的比较严重
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)