Java基础——Servlet(八)文件上传下载

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

1.初始化上传上下文

2.准备上传

3.保存文件

    <%
        if(request.getParameter("flag")!=null){
               SmartUpload su=new SmartUpload();
               su.initialize(pageContext);
               su.upload();
               su.save("/upload_files");

               out.print("上传成功");
           }
    %>
    <form action="file_up.jsp?flag=ok"  method="post" enctype="multipart/form-data" > //一定要用post
        <input type="file"  name="file1" />
        <input type="submit" value="上传">
    </form>

注意:

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

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

二、多文件上传

<%
        if(request.getParameter("flag")!=null){
               SmartUpload su=new SmartUpload();
               su.initialize(pageContext);
               su.upload();  //别忘了
               su.save("/upload_files");

               SmartRequest req=su.getRequest(); //一定要这样取得 request 对象

               String name=req.getParameter("userName");
               out.write(name); 

               SmartFiles files= su.getFiles();
               int fileCount=files.getCount();
               out.println("<h1>上传文件信息</h1>");
               out.println("<hr>");

               for(int i=0;i<fileCount;i++){
                   SmartFile f = files.getFile(i);
                   out.println("表单项名称:"+f.getFieldName()+"<br>");
                   out.println("上传文件的名称"+f.getFileName()+"<br>");
                   out.println("文件的扩展名:"+f.getFileExt()+"<br>");
                   out.println("文件的大小:"+f.getSize()+"<hr>");
               }
           }
     %>
   <form action="multi_file_up.jsp?flag=ok"  method="post"  enctype="multipart/form-data" >
        <input type="file"  name="file1" /> <br>
        <input type="file"  name="file2" /> <br>
        <input type="file"  name="file3" /> <br>
        <input type="file"  name="file4" /> <br>
账号:    <input type="text" name="userName" />
密码: <input type="text" name="password" />
        <input type="submit" value="上传">
    </form>

三、使用 Servlet 上传文件

SmartUpload smart=new SmartUpload();
        //它的参数:
        //Servlet servlet
        //ServletRequest request
        //ServletResponse response
        //String errpageUrl
        //boolean needSession
        //int buffer
        //boolean autoflush
        PageContext pagecontext=JspFactory.getDefaultFactory().getPageContext(this, request, response, "", true, 8192, true);
        smart.initialize(pagecontext);

        try {
            smart.upload();
            //smart.save("/upload_files");  //由于后面是一个个存的,这个save就可以不要了
            SmartFiles files=smart.getFiles();

            for(int i=0;i<files.getCount();i++){
                SmartFile f=files.getFile(i);
                String ip=request.getRemoteAddr();
                String fileName=f.getFileName();  //文件名
                //String fileExt =f.getFileExt();  //扩展名

                String fullName=ip+"-"+fileName;

                //request.getServletContext().getRealPath("/");

                f.saveAs("/upload_files"+java.io.File.separator+ fullName);
            }

            SmartRequest req=smart.getRequest();
            String userName=req.getParameter("userName");
            String password=req.getParameter("password");

            System.out.println(userName+":"+password);

        } catch (SmartUploadException e) {
            e.printStackTrace();
        }

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

try {
                SmartUpload smart = new SmartUpload();
                PageContext pageContext = null;
                pageContext = JspFactory.getDefaultFactory().getPageContext(this,
                        request, response, "", true, 8192, true);
                smart.initialize(pageContext);
                smart.upload();
                SmartFile f=smart.getFiles().getFile(0);

                // 1 取得上传的商品的信息
                SmartRequest req = smart.getRequest();
                String goodsName = req.getParameter("goodsName");
                float price = Float.parseFloat(req.getParameter("price"));
                String des = req.getParameter("des");
                String picture=f.getFileName();  //注意图片管理方面的问题,比如覆盖,删除等

                GoodsInfo goods=new GoodsInfo();
                goods.setGoodsName(goodsName);
                goods.setPrice(price);
                goods.setDes(des);
                goods.setPicture(picture);

                _dao.addGoods(goods);

                // 2 上传图片
                f.saveAs("/goods_pic"+java.io.File.separator+picture);

                request.setAttribute("goods", goods);
                request.setAttribute("msg", "商品添加成功");
                request.getRequestDispatcher("/goods/goods_add.jsp").forward(request, response);
            }

            catch (Exception ex) {
                ex.printStackTrace();
            }
<form action="GoodsServlet" method="post" enctype="multipart/form-data">
         名称:<input type="text" name="goodsName" value="${goods.goodsName }" />  <br>
         价格:<input type="text" name="price" /> <br>
         描述:<input type="text" name="des" /> <br>
         图片:<input type="file" name="picture" /> <br>
         <input type="submit" value="提交" />
         <img src="${pageContext.request.contextPath }/goods_pic/${goods.picture }" >
         ${msg }
       </form>

五、文件的下载

//Servlet中
             SmartUpload smart=new SmartUpload();
                PageContext pageContext=JspFactory.getDefaultFactory().getPageContext(this, request, response, "", true, 8192, true);
                smart.initialize(pageContext);
                smart.setContentDisposition(null); // 用来指定下载数据的mine类型,传null 组件会自动的添加默认类型

                try {
                    smart.downloadFile("/goods_pic/lengtu.jpg");
                } catch (SmartUploadException e) {
                    e.printStackTrace();
                }
//jsp中
<a href="FileDownloadServlet" >下载</a>

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

//在jsp中的配置
   <form action="FilieUpServlet" method="post" enctype="multipart/form-data">
       <input type="text" name="userName" />
       <input type="text" name="password" />
       <input type="file" name="photo" />
       <input type="submit" value="提交 "/>
   </form>

//在Servlet中
    public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

        ServletInputStream inputStream=request.getInputStream();
        String filePath=getServletContext().getRealPath("/upload-files")+"/XXX.bmp";  //随给被上传的文件起个名字
        FileOutputStream outStream=new FileOutputStream(filePath);

        byte[] buff=new byte[1024];
        int len=0;
        while((len=inputStream.read(buff,0,buff.length))!=-1){
            outStream.write(buff,0,len);
        }
            inputStream.close();
            outStream.close();
            System.out.println("成功");
    }

说明 :上例中,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中

public void doPost(HttpServletRequest request, HttpServletResponse response)
                                    throws ServletException, IOException {

                                try{
                                    SmartUpload smart = new SmartUpload();
                                    PageContext pageContext = null;
                                    pageContext = JspFactory.getDefaultFactory().getPageContext(this,    request, response, "", true, 8192, true);

                                    smart.initialize(pageContext);
                                    smart.upload();
                                    SmartFile f = smart.getFiles().getFile(0);

                                    //取得上传的商品的信息
                                    SmartRequest req = smart.getRequest();
                                    String goodsName = req.getParameter("goodsName");
                                    float price = Float.parseFloat(req.getParameter("price"));
                                    String des = req.getParameter("des");
                                    String picture = f.getFileName(); 

                                    GoodsInfo goods = new GoodsInfo();
                                    goods.setGoodsName(goodsName);
                                    goods.setPrice(price);
                                    goods.setDes(des);
                                    goods.setPicture(picture);

                                    byte [] buff=new byte[f.getSize()];  //这里是关键

                                    //将文件,转成字节数组,这里是关键
                                    for(int i=0;i<f.getSize();i++){
                                        buff[i]=f.getBinaryData(i);
                                    }

                                    goods.setPhoto(buff);  //关键

                                    _dao.addGoods(goods);

                                }
                                catch(Exception ex){
                                    ex.printStackTrace();
                                }

                            }

4) test_photo.jsp 中 :

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

5) photo.jsp 中:

<%
                            GoodsInfo goods=new GoodsDao().getGoodsById(8);

                            response.setContentType("image/jpg");

                            ByteArrayOutputStream imageStream=new ByteArrayOutputStream();
                            imageStream.write(goods.getPhoto());

                            ServletOutputStream streamOut=response.getOutputStream();

                            imageStream.writeTo(streamOut);
                            imageStream.close();

                             out.clear();
                            out=pageContext.pushBody();

                        /*由于jsp container在处理完成请求后会调用releasePageContet方法释放所用的PageContext object,
                            并且同时调用getWriter方法,由于getWriter方法与在jsp页面中使用流相关的getOutputStream方法冲突,
                            所以会造成这种异常,解决办法是:只需要在jsp页面的最后加上两条语句:
                            out.clear();out=pageContext.pushBody();即可(其中out,pageContext均为jsp内置对象! */
                    %>

八、不用插件的文件下载

//例一,最简单的
            == Servlet1 ==
                response.setContentType("application/x-msdownload");
                response.setHeader("Content-Disposition" , "attachment;filename=xxx");

                ServletOutputStream stream= response.getOutputStream();
                stream.write("ha ha ha this is file".getBytes());
                stream.close();
//例二 下载一幅服务器上的图象
          == Servlet12 ==
            response.setContentType("application/x-msdownload");
                response.setHeader("Content-Disposition" , "attachment;filename=xxx");

                String filePath=this.getServletContext().getRealPath("/")+"/goods_pic/"+"lengtu.jpg";
                FileInputStream fis=new FileInputStream(filePath);

                ServletOutputStream outStream= response.getOutputStream();

                byte[] buff=new byte[1024];
                int len=0;
                while((len=fis.read(buff))!=-1){
                    outStream.write(buff,0,len);
                }

                fis.close();
                outStream.close();

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

function setImagePreview(docObj, localImagId, imgObjPreview, width, height) {
        if (docObj.files && docObj.files[0]) { //火狐下,直接设img属性
            imgObjPreview.style.display = ‘block‘;
            imgObjPreview.style.width = width;
            imgObjPreview.style.height = height;
            //火狐7以上版本不能用上面的getAsDataURL()方式获取,需要一下方式
            imgObjPreview.src = window.URL.createObjectURL(docObj.files[0]);
        } else { //IE下,使用滤镜
            docObj.select();
            var imgSrc = document.selection.createRange().text;
            //必须设置初始大小
            localImagId.style.width = width;
            localImagId.style.height = height;
            //图片异常的捕捉,防止用户修改后缀来伪造图片
            try {
                localImagId.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale)";
                localImagId.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = imgSrc;
            } catch (e) {
                alert("您上传的图片格式不正确,请重新选择!");
                return false;
            }
            imgObjPreview.style.display = ‘none‘;
            document.selection.empty();
        }
    }

        <form action="GoodsPhotoServlet" method="post" enctype="multipart/form-data">
          名称:<input type="text" name="goodsName" value="${goods.goodsName }" />
          价格:<input type="text" name="price" />
          描述:<inputtype="text" name="des" /> <br>
          图片:<input type="file"name="picture" onchange="setImagePreview(this,localImag,preview,‘100px‘,‘125px‘);" />
            <input type="submit" value="提交" /> 

                <div id="localImag" style="margin-left: 24px" ></div>
                <img id="preview" alt="请上传照片" style="width:122px; height: 145px;" />
        </form>
时间: 2024-10-06 12:15:04

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

Java jsp servlet 实现文件上传 最简单操作

|--实现文件上传的方式 1.进入http://commons.apache.org/proper/commons-fileupload/using.html 2.点击用户指南 3.对着用户指南一步步复制粘贴,并把代码撸成自己想要的样子 补充:记得要将commons-io-2.4.jar和commons-fileupload-1.2.2.jar这两个包放到编译器里面 |--现成的代码 1 <%-- 2 Created by IntelliJ IDEA. 3 User: Administrator

java web 文件上传下载

文件上传下载案例: 首先是此案例工程的目录结构: 处理上传: FileUploadServlet.java 1 package fnz.fileUploadTest; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.PrintWriter; 7 import java.text.SimpleDateFormat; 8 import java.

文件上传下载—servlet API实现

servlet API实现文件上传下载需要的jar包: UploadServlet.java package com.ymw.web.servlet; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.UUID; import javax.servl

salesforce 零基础学习(四十二)简单文件上传下载

项目中,常常需要用到文件的上传和下载,上传和下载功能实际上是对Document对象进行insert和查询操作.本篇演示简单的文件上传和下载,理论上文件上传后应该将ID作为操作表的字段存储,这里只演示文件上传到Document对象中. 一.文件上传功能 apex代码 1 public with sharing class FileUploadUsedTransientController { 2 3 public transient Blob fileUploadBody{get;set;} 4

28、java文件上传下载、邮件收发

文件上传下载 前台: 1. 提交方式:post 2. 表单中有文件上传的表单项: <input type="file" /> 3. 指定表单类型: 默认类型:enctype="application/x-www-form-urlencoded" 文件上传类型:multipart/form-data FileUpload 文件上传功能开发中比较常用,apache也提供了文件上传组件! FileUpload组件: 1. 下载源码 2. 项目中引入jar文件

基于Java的一个简单的文件上传下载功能

最近在公司给客户端做接口,有一个图片上传和文件下载的功能,本来想用Struts来做文件上传下载,但是看了下公司好像没有这个配置,然后看了下同事的代码,才发现原来Apache也可以简单的实现文件上传下载. 首先引入commons-io-2.2.jar FileUtils为我们提供了很多对文件的操作的方法,比如上传整个文件夹的文件.上传单个文件等 然后请看代码下载: public static void uploadFile(String targetDirectory,String targetF

SpringMVC文件上传下载

在Spring MVC的基础框架搭建起来后,我们测试了spring mvc中的返回值类型,如果你还没有搭建好springmvc的架构请参考博文->http://www.cnblogs.com/qixiaoyizhan/p/5819392.html 今天我们来讲讲spring mvc中的文件上传和下载的几种方法. 首先附上文件目录->我们需要配置的我做了记号-> 一.文件上传 首先为了方便后续的操作,以及精简代码,我们在Utils包下封装一个文件上传下载的帮助类: Files_Helper

SSM框架-SpringMVC 实例文件上传下载

SSM框架-SpringMVC 实例文件上传下载 2017-04-17 09:38 4497人阅读 评论(6) 收藏 举报  分类: java基础(3)  目录(?)[+] 目录(?)[+] 林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文详细讲解了SpringMVC实例单文件上传.多文件上传.文件列表显示.文件下载. 本文工程免费下载 一.新建一个Web工程,导入相关的包 springmvc的包+commons-fileupload

国际化、文件上传下载

原生实现,步骤优点复杂: 国际化: 根据Local代表的区域信息可以进行国际化(了解) 1.得到你要国际化的区域信息,local cn = Local.CHINA; 2.需要使用ResourceBundle绑定写好的国际化资源文件,(基础名_语言代码_国家代码.properties) ResourceBundle bundle = ResourceBundle.getBundle("bookstore",cn); 3.从bundle中获取配置文件中的值 String username

Struts2之文件上传下载

本篇文章主要介绍如何利用struts2进行文件的上传及下载,同时给出我在编写同时所遇到的一些问题的解决方案. 文件上传 前端页面 1 <!-- 引入struts标签 --> 2 <%@taglib prefix="s" uri="/struts-tags"%> 3 4 <!-- 5 使用struts中的<s:file></s:file>标签来选择文件. 6 设置name属性,则提交后将传递后给后台一个name属性