关于Http文件上传分析与实现

来源:互联网 发布:淘宝上卖燕窝不让卖 编辑:程序博客网 时间:2024/06/08 16:52

1.需求分析

由于最近看到有人论坛上发帖称自己用了网上的某个框架,因为是在裸机上面开发的,并没有检测到病毒,等用其他机器演示的时候整个项目出现了病毒,并且客户直接否认了这个项目,突然让我想到了学长说的一句话:工具类我一般自己写,谁知道他们写成什么样子给你用呢。又鉴于文件上传功能比较常见,而且大部分人都还在使用像SmartUpload等组件.而我实在是不想使用这类工具了,所以打算自己动手写一个文件上传的实现

2.实现思路

首先,通过分析表单提交的内容到底包含一些什么内容,然后逐步解析,从而得到自己想要的文件信息,最后通过流的形式写入服务器硬盘中.

3.功能实现

首先,使用IDE自动生成一个web工程,在web工程中创建servlet命名为:UploadServlet,并且在web.xml中映射成/UploadServlet;并且在index.jsp页面中加入Form表单如下:

<form action="UploadServlet" method="post"enctype="multipart/form-data">用户名:<input type="text" name="username"><br>密码:<input type="text" name="password"><br>上传文件<input type="file" name="file"><br><input type="submit" value="Submit"></form>
而UploadServlet中的post方法中加入下列代码:

response.setContentType("text/html");response.setCharacterEncoding("UTF-8");request.setCharacterEncoding("UTF-8");PrintWriter out = response.getWriter();BufferedReader bufferReader = new BufferedReader(new InputStreamReader(request.getInputStream()));String line = "";while ((line = bufferReader.readLine()) != null) {System.out.println(line);}
然后通过打印出request流中的信息如下:

------WebKitFormBoundarysmYDzdkAUIGlvggBContent-Disposition: form-data; name="username"1540547545@qq.com------WebKitFormBoundarysmYDzdkAUIGlvggBContent-Disposition: form-data; name="password"terrylmay------WebKitFormBoundarysmYDzdkAUIGlvggBContent-Disposition: form-data; name="file"; filename="SoftwareCache.java"Content-Type: application/octet-streampackage com.redmoon.forum.plugin.errorquery;public class SoftwareCache extends ObjectCache {public String putSoftwareInfo(String type, int id) throws CacheException {SoftwareDao softwareDao = new SoftwareDao();result = softwareDao.getDescriptionByID(id, type);rmCache.putInGroup(group + id + "_" + type, group, result);System.out.println("返回的是从数据库中取出的数据");return result;}}------WebKitFormBoundarysmYDzdkAUIGlvggB--

可以看到如果Form表单中使用了enctype="multipart/form-data"定义的表单当提交表单时表单字段信息以及文件信息放入到request的流中进行提交。所以如果想要获取到上传文件的内容只能通过解析流的方式拿到。而通过request.getHeader这种方法拿到的只能是图中的Header里面的信息


并且是拿不到Request Payload中的某个字段的信息的.后面就是最蛋疼的事了.恐怕解析起来要花好长时间,当然强力解析肯定是不行的.毕竟要找出规律才有重用性

通过一天的学习,研究终于写出了一个文本文件,图片文件以及其他文件都能够上传的通用类,并且能够支持多文件上传.只要界面中能够进行多选的话,不说废话了.核心代码如下

while (i != -1) {// 拿到该行数据String line = new String(buff, 0, i);if (line.startsWith("Content-Disposition:")) {// 如果不是文件域,那么肯定是表单字段域了if (!line.contains("filename")) {int index = line.indexOf("name=");String name = "";if (index != -1) {name = line.substring(index + 6, line.length() - 3);System.out.println(name);}// 找到字段域中的值in.readLine(buff, 0, 1024);i = in.readLine(buff, 0, 1024);String value = new String(buff, 0, i);// 放入到fileds中.到时候查找的时候也方便查找fields.put(name, value);System.out.println("(" + name + "," + value + ")");} else if (line.contains("filename")) {int index = line.indexOf("filename=");// 通过内容格式找到文件名称setFileName(line);System.out.println(this.fileName);// 连续读取2行,取出无用信息in.readLine(buff, <span style="background-color: rgb(255, 255, 255);">http:// </span><span style="font-family: Arial, Helvetica, sans-serif;">0, 1024);</span>
in.readLine(buff, 0, 1024);// 读取文件的内容i = in.readLine(buff, 0, 1024);line = new String(buff, 0, i, "ISO8859_1");FileOutputStream out = new FileOutputStream(new File(saveFilePath, fileName));while (i != -1 && !line.startsWith(this.boundary)) {i = in.readLine(buff, 0, 1024);if (new String(buff, 0, i).startsWith(boundary)) {out.write(line.substring(0, line.length() - 2).getBytes("ISO8859_1"));break;} elseout.write(line.getBytes("ISO8859_1"));line = new String(buff, 0, i, "ISO8859_1");}}}i = in.readLine(buff, 0, 1024);}

首先根据图中的头文件信息格式,来判断如果包含有filename信息的,则直接对后面的信息进行存储,如果不包含filename信息的,直接对其进行解析,然后把解析出来的字段以及他的value放入到map中.方便读取.具体代码文件下载:http://download.csdn.net/detail/maylorchao/7357091



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 海绵城市改造只挖不修怎么办 怀孕一个月做了胸透怎么办 怀孕了照了胸透怎么办 刚怀孕照了胸透怎么办 怀孕进了ct室怎么办 消防稳压罐气囊压力不够怎么办 备孕期间拍了ct怎么办 晚上睡不好老做梦怎么办 零线和地线短路怎么办 火花塞拧的过紧怎么办 眼睛被电弧光灼伤怎么办 电脑模拟器微信附近人屏蔽了怎么办 美的电压锅漏气怎么办 电压力锅排气阀漏气怎么办 win10系统上不了网怎么办 手机自拍杆坏了怎么办 车辆遭核生化打击时怎么办? 遭核生化打击时怎么办? 车辆行驶中遭核生化打击时怎么办? 硫酸气体熏到嗓子怎么办 硫酸味儿进嗓子了怎么办 吸入二氧化氯气体后怎么办 衣服84消毒 变色了怎么办 我的身份证被诈骗犯知道了怎么办 母婴店来客人少怎么办 键盘驱动被卸载了怎么办 广州 狗狗随地大小便怎么办 上海 狗狗随地大小便怎么办 服装店人流量少生意差怎么办 2018年服装店生意特别差怎么办 打印机拍的照片打出黑怎么办 租的汽车撞了怎么办 神州租车车坏了怎么办 深圳市公安局办保安员证怎么办? 老婆被车撞了后失忆了怎么办 生气引起的短暂失忆怎么办 win10系统忘记开机密码怎么办 戴尔win10密码忘了怎么办 戴尔电脑win10密码忘了怎么办 出门忘记带身份证了怎么办 一年染了7次头发怎么办