java文件上传技术

用到了Apache 的common-uploader jar包实现后台的文件上传技术。
前台使用了webUploader的技术,更方便和形象的展现上传效果。

1.普通文件上传
前端界面 编写

<body>
       <form action="Uploader" method="post" enctype="multipart/form-data">
        请选择上传的文件:<input type="file" name="attach"/><br/>
        <input type="submit" value="提交"/>
    </form>
  • enctype 一定是 multipart/form-data

servlet

package cn.hjm.controller;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;

public class Uploader extends HttpServlet {

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

        //看common-uploader的官方文档就知道以下代码
        // Create a factory for disk-based file items
        DiskFileItemFactory factory = new DiskFileItemFactory();
        // Configure a repository (to ensure a secure temp location is used)
        ServletContext servletContext = this.getServletConfig().getServletContext();
        File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
        factory.setRepository(repository);
        ServletFileUpload sfu = new ServletFileUpload(factory);
        sfu.setHeaderEncoding("utf-8");
   //以上都是官方例子

        try {
            // Parse the request
            List<FileItem> items =sfu .parseRequest(request);
            //获取遍历器
            Iterator<FileItem> iter = items.iterator();
            //遍历
            while (iter.hasNext()) {
                FileItem item = iter.next();
                if (item.isFormField()) { //判断是否是普通文本框
                    String fieldName = item.getFieldName();//我不知道这两个有什么毛用
                    String value = item.getString("utf-8");
                } else {
                   if(item.getName()!=null&& !item.getName().equals("")){
    //使用已有的方法进行拷贝                  FileUtils.copyInputStreamToFile(item.getInputStream(), 
    new File("c:/targetFiles/"+item.getName()) );
                       item.delete();
                   }
                }
            }
        } catch (FileUploadException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

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

        doGet(request,response);
    }
}

这两个就可以进行文件的上传了,是不是很简单。

2.如何 展示上传进度呢?

采用了百度团队开源的 webUploader ,这个去百度搜索一下就可以下载了
1.引用了三个文件

<link rel="stylesheet" type="text/css"
    href="${pageContext.request.contextPath}/css/webuploader.css">
<script type="text/javascript"
    src="${pageContext.request.contextPath }/js/jquery-1.10.2.min.js"></script>
<script type="text/javascript"
    src="${pageContext.request.contextPath }/js/webuploader.js"></script>

编写前端代码



<body>
   <div id="uploader">
        <!-- 显示文件列表信息-->
            <ul id ="fileList"></ul>
        <!-- 选择文件区域 -->
        <div id ="filePicker" >点击选择文件</div>
   </div>
   <script type="text/javascript">
        //1.初始化WebUpload,以及配置全局的参数
        var uploader = WebUploader.create(
            {
            //flashk控件的地址
            swf: "${pageContext.request.contextPath}/js/Uploader.swf",
            //后台提交地址
            server:"${pageContext.request.contextPath}/Uploader",
            //选择文件控件的标签
            pick:"#filePicker",
            //自动上传文件
            auto:true,
            }
        );

        //2.选择文件后,文件信息队列展示
        // 注册fileQueued事件:当文件加入队列后触发
        // file: 代表当前选择的文件
        uploader.on("fileQueued",function(file){
            //追加文件信息div
            $("#fileList").append("<div id='"+file.id+"' class='fileInfo'><span>"+file.name+"</span><div class='state'>等待上传...</div><span class='text'></span></div>");
        });


        //3.注册上传进度监听
        //file: 正在上传的文件
        //percentage: 当前进度的比例。最大为1.例如:0.2
        uploader.on("uploadProgress",function(file,percentage){
            var id = $("#"+file.id);
            //更新状态信息
            id.find("div.state").text("上传中...");
            //更新上传百分比
            id.find("span.text").text(Math.round(percentage*100)+"%");
        });

        //4.注册上传完毕监听
        //file:上传完毕的文件
        //response:后台回送的数据,以json格式返回
        uploader.on("uploadSuccess",function(file,response){
            //更新状态信息
            $("#"+file.id).find("div.state").text("上传完毕");
        });



    </script>
  </body>
然后,servlet还是上面的那个,这样就可以完成进度的展现了。
这些功能看过去有点难度,去做其实还是很简单的。多动手实践。没有一步就可以成功的。
爱迪生发明电灯丝还经历了那么多的失败。我们这算什么 。
所以,怕出现错误而不敢去实践的程序员不会成长。
希望自己能够突破自己。

百度下载都可以找到
用到了jar包是
commons-fileupload-1.2.2.jar
commons-io-2.1.jar

css:
webuploader.css

js:
jquery-1.10.2.min.js
Uploader.swf 兼容IE
webuploader.js

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值