Sevlet 3 以前,Servlet API中没有支持上传功能的API,因此要实现上传功能需要引入第三方工具从POST请求中获得上传的附件或者通过自行处理输入流来获得上传的文件,我们推荐使用Apache的commons-fileupload。然而从Servlet 3开始,文件上传变得无比简单

 

文件下载

 

//文件下载功能

 

// 前台页面我用的是Easyui框架写的前台页面

  <!-- 页面加载开始 -->

      <div id="panel_datagrid_uploads_m080" title="文件上传" data-options="fit:true" border="false">

<div id="toolbar_uploads_m080">

<a href="#" data-options="iconCls:'icon-add',plain:true" onclick="openDownloadsAdd_m080()">文件下载</a>

</div>

</div>

  <!--页面加载结束-->

  <!--打开文件下载窗口开始  -->

  <div id="dialog_add_downloads_m080"

style="display: none; top: 10%; width: 600px; height: 400px; padding: 10px 20px">

    <a href="" id="ssUrl">文件下载</a>  

</div>

 <!--打开文件下载窗口结束  -->

 

//页面所对应的的js文件

 

//文件下载

//dialog

var dialog_add_downloads_m080;

function openDownloadsAdd_m080(){

dialog_add_downloads_m080=$('#dialog_add_downloads_m080').show().dialog({

title:'文件下载',

modal:true

});

}

//文件下载 filename是需要从数据库查询出来现将定义成固定值myfile.txt

var filename="myfile.txt";

$("#ssUrl").attr('href',"uploadfile/download?filename="+filename);

 

// java后台代码篇

@RequestMapping(value = {"/download"},method = RequestMethod.GET)

public void download(@RequestParam("filename") String filename, HttpServletRequest request,HttpServletResponse response) throws IOException {

if(!StringUtils.isEmpty(filename)) {

//模拟文件,myfile.txt为需要下载的文件  

        String path = "D:\\file"+"\\"+filename;

        //创建添加定义获取文件

        File file=new File(path);

        //创建添加定义获取该文件的文件输入流

            FileInputStream fileInputStream=new FileInputStream(file);

    //创建添加定义将文件输入流放在输入流里

            InputStream inputStream=new BufferedInputStream(fileInputStream);

            //创建添加定义转码防止文件名中文乱码

    filename=URLEncoder.encode(filename,"UTF-8");

    //创建添加定义设置文件下载头

    response.setHeader("Content-Disposition", "attachment;filename=" + filename);

    //创建添加定义设置下载文件类型

    response.setContentType("multipart/form-data");

    //创建添加定义获取文件输出流

    BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(response.getOutputStream());

    int len=0;

    while((len = inputStream.read()) != -1){  

     bufferedOutputStream.write(len);  

     bufferedOutputStream.flush();  

        }  

    bufferedOutputStream.close();

}


}

 

文件下载功能注意几点,我的下载的路径固定为"D:\file"+"\"+filename;这个路径,也可是Tomcat发布好的webapps下。注意文件名的拼写,注意路径的配置。

 

文件上传

 

文件上传的第一种方式(直接使用form表单提交)

 

// 直接使用form表单提交

   <div>

        <!-- 第一种方式直接使用form表单的方式实现文件上传 -->

     <form action="${pageContext.request.contextPath}/user/uploadfile/uploadfile1" method="post" enctype="multipart/form-data">

     <input type="file" name="ffFile" />

     <input type="submit" value="上传" />

     </form>

    </div>

 

//后台java代码

 

/**

 * 创建添加定义一个使用Spring实现文件上传

 * @param request

 * @return

 * @throws IOException

 * @throws IllegalStateException

 */

@RequestMapping("/uploadfile1")

@ResponseBody

public ResultJson springUpload1(HttpServletRequest request) throws IllegalStateException, IOException {

    ResultJson resultJson=new ResultJson();

    //获取从1970年到现在的毫秒数

    Long startTime=System.currentTimeMillis();

    //将当前上下文初始化给CommonsMultipartResolver(多部分解析器)

    CommonsMultipartResolver commonsMultipartResolver=new CommonsMultipartResolver(request.getSession().getServletContext());

    //检查form表单中有没有enctype="multipart/form-data"这个属性

    if(commonsMultipartResolver.isMultipart(request))

        {

    //将request转换成多部分请求

MultipartHttpServletRequest multipartHttpServletRequest=(MultipartHttpServletRequest) request;

//获取multipartHttpServletRequest的所有的文件名

Iterator irIterator=multipartHttpServletRequest.getFileNames();

while(irIterator.hasNext()) {

MultipartFile multipartFile=multipartHttpServletRequest.getFile(irIterator.next().toString());

if(multipartFile!=null){

String path="E:/springUpload/"+multipartFile.getOriginalFilename();

// 检查该路径对应的目录是否存在,如果不存在则创建目录

File dir = new File(path);

if (!dir.exists()) {

dir.mkdirs();

}

//上传


 multipartFile.transferTo(new File(path));

}

}

        }

    Long endTime=System.currentTimeMillis();

    System.out.println("文件上传一共用时 "+String.valueOf(endTime-startTime)+" 毫秒");

    return resultJson;

}

 

文件上传的第二种方式(使用ajaxformData的方式实现文件上传)

 

//使用ajax的formData的方式实现文件上传

// 前台页面使用ajax的formData的方式实现文件上传

     <!--第二种方式使用ajax的formData的方式实现文件上传  -->

 <!--打开文件上传窗口开始  -->

  <div id="dialog_add_uploads_m080"

style="display: none; top: 10%; width: 600px; height: 400px; padding: 10px 20px">

<form id="tf">

            <input  class="easyui-filebox" name="ffFile"/>

            <input data-options="iconCls:'icon-ok'" value="文件上传" onclick="test();" "/>

        </form>

</div>

 <!--打开文件上传窗口结束  -->

 

// 前台页面所对应的js文件

//文件上传1

// add dialog

var dialog_add_uploads_m080;

function openUploadsAdd1_m080(){

dialog_add_uploads_m080=$('#dialog_add_uploads_m080').show().dialog({

title:'文件上传1',

modal:true

});

}

//这个是在jsp页面中写的js,需要获取项目的根路径不可以使用相对路径

  <script type="text/javascript">

    var rootPath="${pageContext.request.contextPath}";

    function test(){

      var form = new FormData(document.getElementById("tf"));

      $.ajax({

             url:rootPath+"/user/uploadfile/uploadfile",

             type:"post",

             data:form,

             cache: false,

             processData:false,

             contentType:false,

             success:function(data){

              if(data!=null){

                 console.log("成功不为空");

                 alert("成功不为空!");

              }else{

                 console.log("失败为空");

                 alert("失败!");

              }

              },

             error:function(e){

                 alert("错误!!"+e);

                 window.close();

             }

         });            

    }

    </script>

 

// java后台代码

// 第二种方式使用ajax的formData的方式实现文件上传

 

/**

 * 创建添加定义一个 使用Spring实现文件上传

 *

 * @return

 */

@RequestMapping("/uploadfile")

@ResponseBody

public ResultJson springUpload(HttpServletRequest request) {

ResultJson json = new ResultJson();

MultipartFile uploadFile = ((MultipartHttpServletRequest) request).getFile("ffFile");

uploadFile(uploadFile, request);

return json;

}

public String uploadFile(MultipartFile multipartFile,HttpServletRequest request) {

String fileName = null;

System.out.println("------------------------------------0202020202020202------------------------------------");

if (multipartFile != null) {

DateFormat format = new SimpleDateFormat("yyyyMMddHHmmssSSS");

String orgFileName = multipartFile.getOriginalFilename();

//fileName = format.format(new Date()) + orgFileName;

if(!SysUtil.isNULL(orgFileName)){

fileName = format.format(new Date()) + "-" + orgFileName;

// 设置保存路径

String path = request.getServletContext().getRealPath("/upload");

// 检查该路径对应的目录是否存在,如果不存在则创建目录

File dir = new File(path);

if (!dir.exists()) {

dir.mkdirs();

}

String filePath = path + "\\" + fileName;


System.out.println(filePath + "controller path");

File file = new File(filePath);

try {

multipartFile.transferTo(file);

} catch (IllegalStateException e) {

System.out.println(e.getMessage());

} catch (IOException e) {

System.out.println(e.getMessage());

}

}


}

return fileName;

}