一、简单的文件上传
常见的组件Smartupload , Apache 的 commons FileUpload
Smartupload上传的步骤:

1.初始化上传上下文

2.准备上传

3.保存文件

  1. <%
  2. if(request.getParameter("flag")!=null){
  3. SmartUpload su=new SmartUpload();
  4. su.initialize(pageContext);
  5. su.upload();
  6. su.save("/upload_files");
  7.  
  8. out.print("上传成功");
  9. }
  10. %>
  1. <form action="file_up.jsp?flag=ok" method="post" enctype="multipart/form-data" > //一定要用post
  2. <input type="file" name="file1" />
  3. <input type="submit" value="上传">
  4. </form>

注意:

1) 表单的 enctype 属性 一定要是 multipart/form-data, method 一定要是post

2) 要确保服务器上有 upload_files 这个文件夹 (当然,文件夹的名称是任意的)

二、多文件上传

  1. <%
  2. if(request.getParameter("flag")!=null){
  3. SmartUpload su=new SmartUpload();
  4. su.initialize(pageContext);
  5. su.upload(); //别忘了
  6. su.save("/upload_files");
  7.  
  8. SmartRequest req=su.getRequest(); //一定要这样取得 request 对象
  9.  
  10. String name=req.getParameter("userName");
  11. out.write(name);
  12.  
  13. SmartFiles files= su.getFiles();
  14. int fileCount=files.getCount();
  15. out.println("<h1>上传文件信息</h1>");
  16. out.println("<hr>");
  17.  
  18. for(int i=0;i<fileCount;i++){
  19. SmartFile f = files.getFile(i);
  20. out.println("表单项名称:"+f.getFieldName()+"<br>");
  21. out.println("上传文件的名称"+f.getFileName()+"<br>");
  22. out.println("文件的扩展名:"+f.getFileExt()+"<br>");
  23. out.println("文件的大小:"+f.getSize()+"<hr>");
  24. }
  25. }
  26. %>
  1. <form action="multi_file_up.jsp?flag=ok" method="post" enctype="multipart/form-data" >
  2. <input type="file" name="file1" /> <br>
  3. <input type="file" name="file2" /> <br>
  4. <input type="file" name="file3" /> <br>
  5. <input type="file" name="file4" /> <br>
  6. 账号: <input type="text" name="userName" />
  7. 密码: <input type="text" name="password" />
  8. <input type="submit" value="上传">
  9. </form>

三、使用 Servlet 上传文件

  1. SmartUpload smart=new SmartUpload();
  2. //它的参数:
  3. //Servlet servlet
  4. //ServletRequest request
  5. //ServletResponse response
  6. //String errpageUrl
  7. //boolean needSession
  8. //int buffer
  9. //boolean autoflush
  10. PageContext pagecontext=JspFactory.getDefaultFactory().getPageContext(this, request, response, "", true, 8192, true);
  11. smart.initialize(pagecontext);
  12.  
  13. try {
  14. smart.upload();
  15. //smart.save("/upload_files"); //由于后面是一个个存的,这个save就可以不要了
  16. SmartFiles files=smart.getFiles();
  17.  
  18. for(int i=0;i<files.getCount();i++){
  19. SmartFile f=files.getFile(i);
  20. String ip=request.getRemoteAddr();
  21. String fileName=f.getFileName(); //文件名
  22. //String fileExt =f.getFileExt(); //扩展名
  23.  
  24. String fullName=ip+"-"+fileName;
  25.  
  26. //request.getServletContext().getRealPath("/");
  27.  
  28. f.saveAs("/upload_files"+java.io.File.separator+ fullName);
  29. }
  30.  
  31. SmartRequest req=smart.getRequest();
  32. String userName=req.getParameter("userName");
  33. String password=req.getParameter("password");
  34.  
  35. System.out.println(userName+":"+password);
  36.  
  37. } catch (SmartUploadException e) {
  38. e.printStackTrace();
  39. }

四、文件上传与数据库操作

  1. try {
  2. SmartUpload smart = new SmartUpload();
  3. PageContext pageContext = null;
  4. pageContext = JspFactory.getDefaultFactory().getPageContext(this,
  5. request, response, "", true, 8192, true);
  6. smart.initialize(pageContext);
  7. smart.upload();
  8. SmartFile f=smart.getFiles().getFile(0);
  9.  
  10. // 1 取得上传的商品的信息
  11. SmartRequest req = smart.getRequest();
  12. String goodsName = req.getParameter("goodsName");
  13. float price = Float.parseFloat(req.getParameter("price"));
  14. String des = req.getParameter("des");
  15. String picture=f.getFileName(); //注意图片管理方面的问题,比如覆盖,删除等
  16.  
  17. GoodsInfo goods=new GoodsInfo();
  18. goods.setGoodsName(goodsName);
  19. goods.setPrice(price);
  20. goods.setDes(des);
  21. goods.setPicture(picture);
  22.  
  23. _dao.addGoods(goods);
  24.  
  25. // 2 上传图片
  26. f.saveAs("/goods_pic"+java.io.File.separator+picture);
  27.  
  28. request.setAttribute("goods", goods);
  29. request.setAttribute("msg", "商品添加成功");
  30. request.getRequestDispatcher("/goods/goods_add.jsp").forward(request, response);
  31. }
  32.  
  33. catch (Exception ex) {
  34. ex.printStackTrace();
  35. }
  1. <form action="GoodsServlet" method="post" enctype="multipart/form-data">
  2. 名称:<input type="text" name="goodsName" value="${goods.goodsName }" /> <br>
  3. 价格:<input type="text" name="price" /> <br>
  4. 描述:<input type="text" name="des" /> <br>
  5. 图片:<input type="file" name="picture" /> <br>
  6. <input type="submit" value="提交" />
  7. <img src="${pageContext.request.contextPath }/goods_pic/${goods.picture }" >
  8. ${msg }
  9. </form>

五、文件的下载

  1. //Servlet中
  2. SmartUpload smart=new SmartUpload();
  3. PageContext pageContext=JspFactory.getDefaultFactory().getPageContext(this, request, response, "", true, 8192, true);
  4. smart.initialize(pageContext);
  5. smart.setContentDisposition(null); // 用来指定下载数据的mine类型,传null 组件会自动的添加默认类型
  6.  
  7. try {
  8. smart.downloadFile("/goods_pic/lengtu.jpg");
  9. } catch (SmartUploadException e) {
  10. e.printStackTrace();
  11. }
  12. //jsp中
  13. <a href="FileDownloadServlet" >下载</a>

六、附:文件上传请求消息的结构

  1. //在jsp中的配置
  2. <form action="FilieUpServlet" method="post" enctype="multipart/form-data">
  3. <input type="text" name="userName" />
  4. <input type="text" name="password" />
  5. <input type="file" name="photo" />
  6. <input type="submit" value="提交 "/>
  7. </form>
  8.  
  9. //在Servlet中
  10. public void doPost(HttpServletRequest request, HttpServletResponse response)
  11. throws ServletException, IOException {
  12.  
  13. ServletInputStream inputStream=request.getInputStream();
  14. String filePath=getServletContext().getRealPath("/upload-files")+"/XXX.bmp"; //随给被上传的文件起个名字
  15. FileOutputStream outStream=new FileOutputStream(filePath);
  16.  
  17. byte[] buff=new byte[1024];
  18. int len=0;
  19. while((len=inputStream.read(buff,0,buff.length))!=-1){
  20. outStream.write(buff,0,len);
  21. }
  22. inputStream.close();
  23. outStream.close();
  24. System.out.println("成功");
  25. }

说明 :上例中,form 的enctype 是默认的,在存文件的时候,也没有使用它传上的来的名称(传上来的名称是C:/pictture/....这样的)

操作以后,可以在upload-files 下 发现有 XXX.bmp 文件,用记事本打开,发现内容如下

userName=zhangsan&password=123&photo=C%3A%5Cpicture%5Cxiaoxin.bmp

上面的代码,由于没有获取实体的长度,只好先定义一个勺用来循环读取,可以看出:对于 application/x-wwww-form-urlencoded 编码的 form表单,所有字段URL参数的形式组合成了一行,并对其中的参数值都进行了URL编码,要想从上面的数据流中提取出各个字段的值,必须对读取到的内容进行拆分,然后再进行url解码,request.getParameter() 等方法可以直接读取上面的字段元素信息,所以Servlet程序中一般不用getInputStream或getReader方式来读取application/x-www-form-urlencoded 编码的表单字段信息。 如果要上传文件,form 元素的enctype 必须设置为 multipart/form-data,并且method必须为POST。

注意:request.getContentLength() 可以得到上传内容的长度,但要注意:并不能保证一次read方法的调用,就能读取到输入流中的所有内容,因为read方法在读取到指定个字节后或读取完网卡缓冲区中的内容后就返回,但网络传输的速度通常比cpu读网卡的速度慢,所以read方法可能只读到部分数据就返回了。实验表明,就算只上传一个图片文件,上传以后,这个图片文件也是不能用的.因为它里面还是有类似----7df1244802dc之类的内容,和普通图片的格式不对。

七、如何把图象存在数据库

1) 在GoodsInfo 这个实体类中加一个字段  private byte []  photo; //代表照片

2) 数据库中加一个 blob类型的字段 名字叫 photo,用来装载图片数据

3) Servlet中

  1. public void doPost(HttpServletRequest request, HttpServletResponse response)
  2. throws ServletException, IOException {
  3.  
  4. try{
  5. SmartUpload smart = new SmartUpload();
  6. PageContext pageContext = null;
  7. pageContext = JspFactory.getDefaultFactory().getPageContext(this, request, response, "", true, 8192, true);
  8.  
  9. smart.initialize(pageContext);
  10. smart.upload();
  11. SmartFile f = smart.getFiles().getFile(0);
  12.  
  13. //取得上传的商品的信息
  14. SmartRequest req = smart.getRequest();
  15. String goodsName = req.getParameter("goodsName");
  16. float price = Float.parseFloat(req.getParameter("price"));
  17. String des = req.getParameter("des");
  18. String picture = f.getFileName();
  19.  
  20. GoodsInfo goods = new GoodsInfo();
  21. goods.setGoodsName(goodsName);
  22. goods.setPrice(price);
  23. goods.setDes(des);
  24. goods.setPicture(picture);
  25.  
  26. byte [] buff=new byte[f.getSize()]; //这里是关键
  27.  
  28. //将文件,转成字节数组,这里是关键
  29. for(int i=0;i<f.getSize();i++){
  30. buff[i]=f.getBinaryData(i);
  31. }
  32.  
  33. goods.setPhoto(buff); //关键
  34.  
  35. _dao.addGoods(goods);
  36.  
  37. }
  38. catch(Exception ex){
  39. ex.printStackTrace();
  40. }
  41.  
  42. }

4) test_photo.jsp 中 :

  1. <img src="${pageContext.request.contextPath }/goods/photo.jsp" />

5) photo.jsp 中:

  1. <%
  2. GoodsInfo goods=new GoodsDao().getGoodsById(8);
  3.  
  4. response.setContentType("image/jpg");
  5.  
  6. ByteArrayOutputStream imageStream=new ByteArrayOutputStream();
  7. imageStream.write(goods.getPhoto());
  8.  
  9. ServletOutputStream streamOut=response.getOutputStream();
  10.  
  11. imageStream.writeTo(streamOut);
  12. imageStream.close();
  13.  
  14. out.clear();
  15. out=pageContext.pushBody();
  16.  
  17. /*由于jsp container在处理完成请求后会调用releasePageContet方法释放所用的PageContext object,
  18. 并且同时调用getWriter方法,由于getWriter方法与在jsp页面中使用流相关的getOutputStream方法冲突,
  19. 所以会造成这种异常,解决办法是:只需要在jsp页面的最后加上两条语句:
  20. out.clear();out=pageContext.pushBody();即可(其中out,pageContext均为jsp内置对象! */
  21. %>

八、不用插件的文件下载

  1. //例一,最简单的
  2. == Servlet1 ==
  3. response.setContentType("application/x-msdownload");
  4. response.setHeader("Content-Disposition" , "attachment;filename=xxx");
  5.  
  6. ServletOutputStream stream= response.getOutputStream();
  7. stream.write("ha ha ha this is file".getBytes());
  8. stream.close();
  1. //例二 下载一幅服务器上的图象
  2. == Servlet12 ==
  3. response.setContentType("application/x-msdownload");
  4. response.setHeader("Content-Disposition" , "attachment;filename=xxx");
  5.  
  6. String filePath=this.getServletContext().getRealPath("/")+"/goods_pic/"+"lengtu.jpg";
  7. FileInputStream fis=new FileInputStream(filePath);
  8.  
  9. ServletOutputStream outStream= response.getOutputStream();
  10.  
  11. byte[] buff=new byte[1024];
  12. int len=0;
  13. while((len=fis.read(buff))!=-1){
  14. outStream.write(buff,0,len);
  15. }
  16.  
  17. fis.close();
  18. outStream.close();

附:上传图片时的预览功能

  1. function setImagePreview(docObj, localImagId, imgObjPreview, width, height) {
  2. if (docObj.files && docObj.files[0]) { //火狐下,直接设img属性
  3. imgObjPreview.style.display = 'block';
  4. imgObjPreview.style.width = width;
  5. imgObjPreview.style.height = height;
  6. //火狐7以上版本不能用上面的getAsDataURL()方式获取,需要一下方式
  7. imgObjPreview.src = window.URL.createObjectURL(docObj.files[0]);
  8. } else { //IE下,使用滤镜
  9. docObj.select();
  10. var imgSrc = document.selection.createRange().text;
  11. //必须设置初始大小
  12. localImagId.style.width = width;
  13. localImagId.style.height = height;
  14. //图片异常的捕捉,防止用户修改后缀来伪造图片
  15. try {
  16. localImagId.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale)";
  17. localImagId.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = imgSrc;
  18. } catch (e) {
  19. alert("您上传的图片格式不正确,请重新选择!");
  20. return false;
  21. }
  22. imgObjPreview.style.display = 'none';
  23. document.selection.empty();
  24. }
  25. }
  26.  
  27. <form action="GoodsPhotoServlet" method="post" enctype="multipart/form-data">
  28. 名称:<input type="text" name="goodsName" value="${goods.goodsName }" />
  29. 价格:<input type="text" name="price" />
  30. 描述:<inputtype="text" name="des" /> <br>
  31. 图片:<input type="file"name="picture" onchange="setImagePreview(this,localImag,preview,'100px','125px');" />
  32. <input type="submit" value="提交" />
  33.  
  34. <div id="localImag" style="margin-left: 24px" ></div>
  35. <img id="preview" alt="请上传照片" style="width:122px; height: 145px;" />
  36. </form>

Java基础——Servlet(八)文件上传下载的更多相关文章

  1. JAVA Web 之 struts2文件上传下载演示(一)(转)

    JAVA Web 之 struts2文件上传下载演示(一) 一.文件上传演示 1.需要的jar包 大多数的jar包都是struts里面的,大家把jar包直接复制到WebContent/WEB-INF/ ...

  2. jsp+servlet实现文件上传下载

    相关素材下载 01.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  3. JAVA Web 之 struts2文件上传下载演示(二)(转)

    JAVA Web 之 struts2文件上传下载演示(二) 一.文件上传演示 详细查看本人的另一篇博客 http://titanseason.iteye.com/blog/1489397 二.文件下载 ...

  4. java commons-fileupload servlet 多文件上传

    commons-fileupload servlet 多文件上传 需要引入的 jar 包. commons-fileupload-1.3.2.jar commons-io-2.2.jar 工程路劲:查 ...

  5. Servlet中文件上传下载

    1.文件下载: package FileUploadAndDown; import java.io.FileInputStream; import java.io.IOException; impor ...

  6. java 如何实现大文件上传下载(传输)各种格式

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...

  7. Java使用 SFTP实现文件上传下载

    package com.lijy.util; import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelSftp; import co ...

  8. 2013第38周日Java文件上传下载收集思考

    2013第38周日Java文件上传&下载收集思考 感觉文件上传及下载操作很常用,之前简单搜集过一些东西,没有及时学习总结,现在基本没啥印象了,今天就再次学习下,记录下自己目前知识背景下对该类问 ...

  9. java中的文件上传下载

    java中文件上传下载原理 学习内容 文件上传下载原理 底层代码实现文件上传下载 SmartUpload组件 Struts2实现文件上传下载 富文本编辑器文件上传下载 扩展及延伸 学习本门课程需要掌握 ...

  10. SpringBoot入门一:基础知识(环境搭建、注解说明、创建对象方法、注入方式、集成jsp/Thymeleaf、logback日志、全局热部署、文件上传/下载、拦截器、自动配置原理等)

    SpringBoot设计目的是用来简化Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,SpringBoot致力于在蓬勃发 ...

随机推荐

  1. 子div撑不开父div

    方法一:推荐 设置父div的overflow:hidden; 方法二: 父div结束前增加一个空div style=”clear:both;” .clear { clear:both; } <d ...

  2. 踩了的Dockerfile的坑

    1.Dockerfile VOLUME的目录,RUN命令操作该目录无效 VOLUME $APP_HOME RUN mkdir -p $APP_HOME && mkdir -p $APP ...

  3. 获取post请求数据工具类

    package com.ccidit.features.otherFunctions.util; import java.io.BufferedReader; import java.io.IOExc ...

  4. Two strings 的另一种解法

    Two strings 的另一种解法 论文中的解法是离线插入 \(O(\log n)\) 询问 \(O(\log n)\) 的,不过我发现有一种离线插入 \(O(1)\) 询问 \(O(\log n) ...

  5. JavaScript高级程序设计--函数小记

    执行环境和作用域链   每个函数都有自己的执行环境.当执行流进入一个函数时,函数 的环境就会被推入一个环境栈中.而在函数执行之后,栈将其环境弹出,把控制权返回给之前的执行环境.   当代码在一个环境中 ...

  6. 三种方法在当前目录下打开cmd命令窗口

    概述 运行npm的时候,每次都要cd到目录,很麻烦,所以总结了三种在当前目录下直接打开cmd窗口的方法,供以后开发时参考,相信对其他人也有用. 方法一 在当前目录按住shift再右键. 会看到右键菜单 ...

  7. 写一个shell 快速启动停止你的微服务吧

    在这个微服务盛行的时代,docker获得了巨大的成功,因为我们需要在一台服务器装上N个服务. 本文不是想讨论如何使用docker,而是,在一台服务器安装了多个服务后,怎样启动方便的启动服务呢? 一.在 ...

  8. Setting Up Swagger 2 with a Spring REST API

    Last modified: August 30, 2016 REST, SPRING by baeldung If you're new here, join the next webinar: & ...

  9. 影响 POST 请求文件上传失败的几个环节的配置(php + nginx)

    写在前面 最近写一个 php 接口,接受上传的文件,发现文件只要超过 5m 以上就会无响应失败,最后发现是 shadowsocks 的 timeout 设置问题(我全程开了全局的 VPN),但一开始并 ...

  10. 机器学习技法笔记:11 Gradient Boosted Decision Tree

    Roadmap Adaptive Boosted Decision Tree Optimization View of AdaBoost Gradient Boosting Summary of Ag ...