文件上传的三种方法 1servlet方式

今天突然想起来文件上传,竟然不会了,赶紧拿出来学习总结下。

**1.原始的servlet文件上传下载
2.Struts2框架的文件上传
3.Spring-Mvc框架的文件上传**

1.原始的servlet文件上传下载

简单说下流程
1. 开发form表单,input type=”file”的控件,修改form表单的enctype=”multipart/form-data”
2. 后台servlet,如果是servlet3.o直接在servlet类前面做一个@MultipartConfig注解 ,如果此时是3.0之前版本,采用apache下面的开源项目commonupload和commonio来做文件上传。
3. doPost方法获取文件,写到服务器的某个目录。

怎么解析上传文件的名字呢?
用firebug看到了文件上传的请求头部有:
content-length:内容长度
Content-type: multipart/form-data; boundary=—————————217601275726149(文件内容分隔符)
Post内容:
—————————217601275726149
Content-Disposition: form-data; name=”ff”; filename=”student.sql” Content-Type: application/octet-stream
我们可以用boundary分割得到第一部分,然后解析字符串,得到filename

具体代码下面贴

Servlet2.5版本文件上传(了解,现在都用3.0的吧!):

http//jakarta.apache.org/commons/fileupload------commonupload和commonio两个jar包
核心上传代码
DiskFileItemFactory factory = new DiskFileItemFactory();  
            factory.setSizeThreshold(1024*1024*20);  
            factory.setRepository(new File(request.getRealPath("/")));  
            ServletFileUpload upload = new ServletFileUpload(factory);  
            upload.setSizeMax(1024*1024*20);  
            List items = upload.parseRequest(request);  
            for(Iterator it=items.iterator(); it.hasNext();){  
                FileItem item = (FileItem)it.next();  
                //判断是否为表单域  
                if(item.isFormField()){  
                    String name = item.getFieldName();  
                    String value = item.getString("UTF-8");  
                    out.println("name=value:"+"name="+name+",value="+value);  
                }else {  
                    //获取文件域名  
                    String fieldName = item.getFieldName();  
                    //获取文件名  
                    String fileName = item.getName();  
                    //获得文件类型  
                    String contentType = item.getContentType();  
                    FileOutputStream fos = new FileOutputStream(request.getRealPath("/") + System.currentTimeMillis()+  
                    fileName.subSequence(fileName.indexOf("."), fileName.length()));  
                    if(item.isInMemory()){  
                        fos.write(item.get());  
                    }else {  
                        InputStream is = item.getInputStream();  
                        byte [] buffer = new byte[1024];  
                        int len;  
                        while((len = is.read(buffer)) >1){  
                            fos.write(buffer, 0, len);  
                        }  
                        is.close();  
                        fos.close();  
item.delete();//临时文件删除要在流关闭之后,不然删除不掉,流没有完全关闭的话,会出现占用资源windows系统的问题  
                    }  

                }  
            }  

Servlet3.0文件上传:

uploadservlet

package com.action;

import java.io.IOException;
import java.util.Collection;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

/**
 * Servlet implementation class uploadServlet
 */
@WebServlet("/upload")
//要上传文件到哪个文件夹
@MultipartConfig(location="d:/upload")
public class uploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public uploadServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        //单,多文件上传通用
        Collection<Part> parts = request.getParts();// 多文件上传   获取part对象 part对象存储文件内容  返回集合类型
        for(Part part:parts){
            //固定写法
            String value=part.getHeader("Content-Disposition");//提取请求头
            int begin = value.indexOf("filename=");
            begin=begin+10;
            int end = value.lastIndexOf("\"");
            String name=value.substring(begin, end);
            //给文件名后追加数字
            Date date=new Date();//java.util.Date
            long time=date.getTime();//获取1970年到现在的毫秒数
            name=name.replace(".",time+".");

            part.write(name);
            part.delete();//删除临时文件
        }


        /*请求头  根据它找到上传文件名    
         * Content-Disposition: form-data; name="upload"; filename="servlet2.docx"
            Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document
         */


    }

}

upload.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<%
//设置页面响应格式
//response.setContentType("application/vnd.ms-excel");
%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<script type="text/javascript" src="js/jquery-1.8.3.js"></script>
<script type="text/javascript">
    $(document).ready(function(){
        $("#submitBtn").click(function(){
            var file=$("#upload").val();
            var reg=/txt$/;
            if(!reg.test(file)){
                alert("上传文件格式不正确");
                return false;
            }



        });

    });
</script>
<body>
<h2>文件上传</h2>
<form action="upload" method="post" enctype="multipart/form-data">

上传<input type="file" name="upload" id="upload">

<!--  
上传<input type="file" name="upload">
上传<input type="file" name="upload">
-->
<input type="submit" value="上传" id="submitBtn" >
</form>
<a href="servlet2.docx"></a>
<a href="downloadServlet">下载</a>

</body>
</html>

servlet文件下载

  1. Response设置contenttype.
    response.setContentType(“application/octet-stream”);

  2. Response设置响应头Content-Dispostion
    response.setHeader(“Content-Disposition”, “attachment;filename=\”aa.xlsx\”“);
    attachment:表示文件输出流会以附件的方式下载。
    downloadservlet

package com.action;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class downloadServlet
 */
@WebServlet("/downloadServlet")
public class downloadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public downloadServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("application/octet-stream");//设置响应格式为任何字节流类型
            //设置响应头 attachment表示文件输出流会以附件的方式下载
            response.setHeader("Content-Disposition", "attachment;filename=\"zyt.doc\"");
            OutputStream out = response.getOutputStream();
            String file="C:/Users/Oracle/Desktop/servlet2.docx";
            InputStream in =new FileInputStream(file);
            //把in读取到的要下载的文件的内容 写入到out 给浏览器
            byte b[]=new byte[1024];//缓冲区
            int len=0;//每一次读取的字节长度
            while((len=in.read(b))!=-1){
                out.write(b, 0, len);
            }
            out.close();


    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

}

download.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<%
    response.setContentType("application/msword");
%>
<body>

</body>
</html>

另外两种方式下一篇说吧,我个人就不爱看特别多页的文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值