吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4223|回复: 21
收起左侧

[Java 转载] Java 文件上传和下载 -违规请删除

[复制链接]
骑狗的猴子 发表于 2018-8-30 20:10
本帖最后由 骑狗的猴子 于 2018-8-31 11:41 编辑


文件上传和下载

1.1  文件的上传:

1.1.1             文件上传的概述:

什么是文件上传:

文件上传:

QQ上传头像.将文件存入到网盘中...

将本地文件写到服务器上.

文件上传的三要素:

文件上传的三要素:

表单的提交的方式必须是POST方式:

GET方式有大小的限制的.POST方式没有大小的限制.

表单中需要有文件上传项:

在表单中需要有<input type=file>.而且文件上传项必须有name的属性.

表单的enctype属性:必须设置为multipart/form-data

文件上传的原理分析:

没有设置enctype属性的情况:

Httpwatch抓包

=========================enctype属性为默认值的情况:没有文件中的内容.

设置了enctype属性为multipart/form-data


文件上传的技术:

JSPSmartUpload:jspSmartUpload组件是应用JSP进行B/S程序开发过程中经常使用的上传下载组件,它使用简单,方便。现在我又为其加上了下载中文名字的文件的支持,真个是如虎添翼,必将赢得更多开发者的青睐。

FileUpload:FileUpload 是Apache commons下面的一个子项目,用来实现Java环境下面的文件上传功能,与常见的SmartUpload齐名.

Servlet3.0       :提供了文件上传的功能.

Struts2                 :提供了文件上传和下载的功能.

1.1.2             文件上传的入门案例:

步骤一:创建一个web项目,引入相应jar:

引入jar包:

commons-fileupload-1.2.1.jar

commons-io-1.4.jar

步骤二:创建一个页面:

满足文件上传的条件:

<h1>文件上传的页面</h1>

<!--

文件上传的三要素

      表单的提交的方式必须是POST方式:

           GET方式有大小的限制的.POST方式没有大小的限制.

      表单中需要有文件上传项:

           在表单中需要有<input type=”file”>.而且文件上传项必须有name的属性.

      表单的enctype属性:必须设置为multipart/form-data

-->



[HTML] 纯文本查看 复制代码
<form action="${ pageContext.request.contextPath }/uploadServlet" method="post" enctype="multipart/form-data">
     文件描述:<input type="text" name="desc"/><br/>
     文件上传:<input type="file" name="upload"/><br/>
     <input type="submit" value="文件上传">
</form>

步骤三:编写Servlet:
[Java] 纯文本查看 复制代码
public class UploadServlet extends HttpServlet {
 
     public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
          /*InputStream is = request.getInputStream();
          String info = IOUtils.toString(is);
          System.out.println(info);*/
          /**
           * 使用FileUpload组件完成文件上传:
           * * 创建一个磁盘文件项工厂:
           * * 创建一个核心解析类:
           * * 使用核心解析类解析request请求.返回一个List集合.封装的一个FileItem的对象.
           * * 遍历List集合获得到表单中的每个部分(FileItem).
           *        * 判断FileItem是否是文件上传项:
           *             * 文件上传项:完成文件上传.
           *             * 普通项:获得普通项名称和值.
           */
          // 创建磁盘文件项工厂:
          DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
          // 创建核心解析类:
          ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
          // 解析request请求:
          try {
                List<FileItem> list = servletFileUpload.parseRequest(request);
                // 遍历集合获得到每个部分:
                for (FileItem fileItem : list) {
                      // 判断是否是文件上传项:
                      if(fileItem.isFormField()){
                           // 普通项
                           String name = fileItem.getFieldName();
                           String value = fileItem.getString();
                           System.out.println(name+"    "+value);
                      }else{
                           // 文件上传项
                           // 获得文件上传的路径:
                           String path = this.getServletContext().getRealPath("/upload");
                           // 获得文件名称:
                           String fileName = fileItem.getName();
                           // 获得文件的内容:
                           InputStream is = fileItem.getInputStream();
                           // 创建一个输出流:
                           OutputStream os = new FileOutputStream(path+"\\"+fileName);
                           // 两个流完成对接:
                           byte[] b = new byte[1024];
                           int len = 0;
                           while((len = is.read(b))!=-1){
                                 os.write(b, 0, len);
                           }
                           is.close();
                           os.close();
                      }
                }
          } catch (FileUploadException e) {
                e.printStackTrace();
          }
     }
 
     public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
 
          doGet(request, response);
     }
 
}


FileUpload中的核心API:
DiskFileItemFactory:磁盘文件项工厂:
TIM截图20180831113842.png


TIM截图20180831114007.png




TIM截图20180831114115.png










删除文件上传中的临时文件的.
通过JS控制多文件的上传:
使用JS添加节点移除节点:
JS的代码:
[JavaScript] 纯文本查看 复制代码
<script type="text/javascript">[/b]
[b]     function add(){[/b]
[b]          // 获得div的元素:[/b]
[b]          var div1 = document.getElementById("div1");[/b]
[b]          // 向div1中写入内容:[/b]
[b]          div1.innerHTML += "<div>文件上传:<input type='file' name='upload'/><input type='button' value='删除' onclick='del(this)'></div>";[/b]
[b]     }[/b]

[b]     function del(who){[/b]
[b]          // 获得删除按钮的父节点的div.[/b]
[b]          // var div = who.parentNode;[/b]
[b]          // 找到div的父节点将div节点移除.[/b]
[b]          // div.parentNode.removeChild(div);[/b]
[b]          who.parentNode.parentNode.removeChild(who.parentNode);[/b]
[b]     }[/b]
[b]</script>

文件上传过程中的问题的解决:
问题:上传文件的文件名的重名的问题:
* 张三和李四都要去上传一个文件:aaa.txt
* 张三的aaa.txt:hello world...
* 李四的aaa.txt:我是李四...
***** 后上传的文件就会将先上传的问题覆盖了.

* 使用唯一文件名:(使用随机的字符串作为文件名.)
* 在Java中如何生存一个不重复的随机的字符串?
* UUID     :UUID.randomUUID();

* 抽取一个获得唯一文件名工具类:
[Java] 纯文本查看 复制代码
public class UUIDUtils {[/b]
 
[b]     /**[/b]
[b]      * 生成唯一文件名的方法:[/b]
[b]      * @param fileName:真实文件名.[/b]
[b]      * @return[/b]
[b]      */[/b]
[b]     public static String getUUIDFileName(String fileName){[/b]
[b]          return UUID.randomUUID().toString().replace("-", "")+"_"+fileName;[/b]
[b]     }[/b]
[b]}


文件下载的概述:
什么是文件下载:
文件下载   :将服务器上文件下载到本地计算机.
从网盘中下载文件.
下载音乐,电影.
1.2.2             文件下载两种形式:
文件下载有两种方式:
一种:超链接下载.
对于下载的资料.将资源写到<a href=”资料路径”>下载</a>.
前提:如果浏览器支持这个格式的文件.可以在浏览器中打开.如果浏览器不支持这个格式的文件.提示下载.
二种:手动编写代码的方式进行下载.
无论浏览器是否支持该格式的文件:提示下载.
设置两个头和一个流:
Content-Type:代表的是文件的MIME类型.
Content-Dispostion:代表文件需要以下载的形式打开.
InputStream:代表的文件的输入流.
因为输出流是固定的:response.getOutputStream();
超链接的方式完成文件下载:
[HTML] 纯文本查看 复制代码
<h1>使用超链接的方式完成文件下载</h1>[/b]
[b]<h3>文件下载</h3>[/b]
[b]<a href="${ pageContext.request.contextPath }/download/tu1.zip">tu1.zip</a><br/>[/b]
[b]<a href="${ pageContext.request.contextPath }/download/tu2.jpg">tu2.jpg</a><br/>

文件下载的入门案例:
手动编码的方式完成文件的下载:
[Java] 纯文本查看 复制代码
public class DownloadServlet extends HttpServlet {[/b]
 
[b]     public void doGet(HttpServletRequest request, HttpServletResponse response)[/b]
[b]                throws ServletException, IOException {[/b]
[b]          /**[/b]
[b]           * 1.接收文件名.[/b]
[b]           * 2.完成文件的下载:[/b]
[b]           * * 获得download路径下的该文件:获得download路径的磁盘绝对路径.[/b]
[b]           * * 设置两个头和一个流:完成文件下载.[/b]
[b]           *        * Content-Type    :MIME类型.[/b]
[b]           *        * Content-Dispostion :[/b]
[b]           *        * InputStream:[/b]
[b]           */[/b]
[b]          // 1.接收文件名:[/b]
[b]          String filename = request.getParameter("filename");[/b]
[b]          // 2.获得download的磁盘绝对路径.[/b]
[b]          String path = this.getServletContext().getRealPath("/download");[/b]
[b]          // 3.设置两个头和一个流:[/b]
[b]          // 动态获得文件的MIME的类型:[/b]
[b]          String mimeType = this.getServletContext().getMimeType(filename);[/b]
[b]          response.setContentType(mimeType);[/b]
[b]          // 设置Content-Dispostion:[/b]
[b]          response.setHeader("Content-Disposition", "attachement;filename="+filename);[/b]
[b]          // 设置文件的输入流InputStream:[/b]
[b]          InputStream is = new FileInputStream(path+"\\"+filename);[/b]
[b]          // 获得一个向浏览器输出的一个输出流:[/b]
[b]          OutputStream os = response.getOutputStream();[/b]
[b]          byte[] b = new byte[1024];[/b]
[b]          int len = 0;[/b]
[b]          while((len = is.read(b))!=-1){[/b]
[b]                os.write(b, 0, len);[/b]
[b]          }[/b]
[b]          is.close();[/b]
[b]     }[/b]
 
[b]     public void doPost(HttpServletRequest request, HttpServletResponse response)[/b]
[b]                throws ServletException, IOException {[/b]
 
[b]          doGet(request, response);[/b]
[b]     }[/b]
 
[b]}

对于中文文件名的处理办法:
[Java] 纯文本查看 复制代码
  // 如果是中文的文件:不同的浏览器是有不同的编码的格式的:[/b]
[b]          // IE浏览器对中文文件使用的URL编码.Firefox浏览器对中文文件采用的是Base64编码.[/b]
[b]          // 判断不同的浏览器采用不同的编码的格式:[/b]
[b]           // User-Agent:包含了客户端的浏览器的信息.[/b]
[b]          String agent = request.getHeader("User-Agent");[/b]
[b]          // System.out.println(agent);[/b]
[b]          if(agent.contains("Firefox")){[/b]
[b]                // 火狐浏览器:[/b]
[b]                filename = base64EncodeFileName(filename);[/b]
[b]          }else{[/b]
[b]                // IE浏览器:[/b]
[b]                filename = URLEncoder.encode(filename, "UTF-8");[/b]
[b]          }[/b]
[b]          response.setHeader("Content-Disposition", "attachment;filename="+filename);[/b]
[b]          // 提供文件的输入流:[/b]
[b]          InputStream is = new FileInputStream(path);[/b]
[b]          // 提供输出流:[/b]
[b]          OutputStream os = response.getOutputStream();[/b]
[b]          // 两个流对接:[/b]
[b]          byte[] b = new byte[1024];[/b]
[b]          int len = 0;[/b]
[b]          while((len = is.read(b))!=-1){[/b]
[b]                os.write(b, 0, len);[/b]
[b]          }[/b]
[b]          is.close();[/b]
[b]     }[/b]
 
[b]     public void doPost(HttpServletRequest request, HttpServletResponse response)[/b]
[b]                throws ServletException, IOException {[/b]
 
[b]          doGet(request, response);[/b]
[b]     }[/b]
 
[b]     /**[/b]
[b]      * Base64对文件名进行编码:[/b]
[b]      * @param fileName[/b]
[b]      * @return[/b]
[b]      */[/b]
[b]     public String base64EncodeFileName(String fileName) {[/b]
[b]          BASE64Encoder base64Encoder = new BASE64Encoder();[/b]
[b]          try {[/b]
[b]                return "=?UTF-8?B?"[/b]
[b]                           + new String(base64Encoder.encode(fileName[/b]
[b]                                      .getBytes("UTF-8"))) + "?=";[/b]
[b]          } catch (UnsupportedEncodingException e) {[/b]
[b]                e.printStackTrace();[/b]
[b]                throw new RuntimeException(e);[/b]
[b]          }[/b]
[b]     }[/b]
[b]}[/b]
 

免费评分

参与人数 4吾爱币 +15 热心值 +4 收起 理由
wushaominkk + 2 + 1 鼓励一下
qwe2913207 + 10 + 1 补偿
赛浩 + 2 + 1 楼主的这种技术,是公司的人才吧,我准备去报一个java培训班了
wuaipojiee + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

赛浩 发表于 2018-8-31 18:36
骑狗的猴子 发表于 2018-8-31 11:44
培训的然后开始工作 在工作的期间在继续学习

楼主什么学历啊?   我专科刚刚毕业  学的机械  对于现在的工作不满意    想重新学习一个技术  选中了java     现在专科找培训机构学习java   能找到工作么??    希望楼主解答一下
 楼主| 骑狗的猴子 发表于 2018-8-31 18:52
赛浩 发表于 2018-8-31 18:36
楼主什么学历啊?   我专科刚刚毕业  学的机械  对于现在的工作不满意    想重新学习一个技术  选中了jav ...

Java目前在编程语言排行榜上 掉到第二三了  你可以先试着学习下 python 看看你对编程有兴趣不,Java已经很成熟了 而且很多培训学Java的 企业找人 的要求高了
 楼主| 骑狗的猴子 发表于 2018-8-30 20:12
内容为我在学习Java时所做的笔记  如果觉得可以 后面可以继续更新
pain5317 发表于 2018-8-30 20:29
学到了,谢谢楼主分享
cs007 发表于 2018-8-30 20:36
想当年我也学过JAVA,可是学不会啊!~~
xmtt2008 发表于 2018-8-30 20:53
这些怎么看不了啊
2018-08-30_205256.jpg
linuxprobe 发表于 2018-8-30 21:27
这个很有用,感谢分享。
alterempty 发表于 2018-8-30 21:51
直接用springmvc啊,就不要写Servlet啦
赛浩 发表于 2018-8-30 22:07
楼主是自学 还是找的培训呢
玖卿 发表于 2018-8-30 22:15
楼主有JAVA的视频教程吗?最新的或者是你正在看的教程或资料都可以
小宇宙i 发表于 2018-8-31 10:42
可以,写的挺好的
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-15 09:26

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表