Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 319|回复: 0

[servlet学习]上传文件的Servlet代码

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-10 07:00:07 | 显示全部楼层 |阅读模式

             
          
          
             
          
          
         
         
       
         本文演示了用户如何从本地上传一个文件到服务器的指定目录。
         

         
    1、代码
         

          
          
            
          
    1. [b]package[/b] quanwen;

    2. [b]import[/b] javax.servlet.*;
    3. [b]import[/b] javax.servlet.http.*;
    4. [b]import[/b] java.io.*;
    5. [b]import[/b] java.util.*;

    6. [b]public[/b] [b]class[/b] UploadServlet [b]extends[/b] HttpServlet {

    7.   //Initialize global variables
    8.   [b]public[/b] [b]void[/b] init(ServletConfig config) [b]throws[/b] ServletException {
    9.     super.init(config);
    10.   }

    11.   //Process the HTTP Post request
    12.   [b]public[/b] [b]void[/b] doPost(HttpServletRequest request, HttpServletResponse response)
    13.      [b]throws[/b] ServletException, IOException {
    14.     [b]final[/b] [b]int[/b] NONE=0;
    15.     [b]final[/b] [b]int[/b] DATAHEADER=1;
    16.     [b]final[/b] [b]int[/b] FILEDATA=2;
    17.     [b]final[/b] [b]int[/b] FIELDDATA=3;
    18.     //将请求消息的实体送到b变量中
    19.     [b]int[/b] TotalBytes=request.getContentLength();
    20.     [b]byte[/b][] b=[b]new[/b] [b]byte[/b][TotalBytes];
    21.     String contentType=request.getContentType();//请求消息类型
    22.     String fieldname="";                        //表单域的名称
    23.     String fieldvalue="";                       //表单域的值
    24.     String filename="";                         //文件名
    25.     String boundary="";                         //分界符
    26.     String lastboundary="";                     //结束符
    27.     [b]int[/b] filesize=0;                             //文件长度
    28.     Hashtable formfields=[b]new[/b] Hashtable();
    29.     [b]int[/b] pos=contentType.indexOf("boundary=");
    30.     String fileID;  //上传的文件ID
    31.     [b]if[/b](pos!=-1)     //取得分界符和结束符
    32.     {
    33.       pos+="boundary=".length();
    34.       boundary="--"+contentType.substring(pos);
    35.       lastboundary=boundary+"--";
    36.     }
    37.     [b]int[/b] state=NONE;
    38.     //得到数据输入流reqbuf
    39.     DataInputStream in=[b]new[/b] DataInputStream(request.getInputStream());
    40.     in.readFully(b);
    41.     in.close();
    42.     String reqContent=[b]new[/b] String(b);
    43.     BufferedReader reqbuf=[b]new[/b] BufferedReader([b]new[/b] StringReader(reqContent));
    44.     [b]boolean[/b] flag=[b]true[/b];
    45.     [b]int[/b] i=0;
    46.     [b]while[/b](flag==[b]true[/b])
    47.     {
    48.       String s=reqbuf.readLine();
    49.       [b]if[/b]((s==lastboundary)||(s==[b]null[/b])) [b]break[/b];
    50.       [b]switch[/b](state)
    51.       {
    52.          [b]case[/b] NONE:
    53.             [b]if[/b] (s.startsWith(boundary))
    54.               {
    55.                  state=DATAHEADER;
    56.                  i+=1;
    57.               }
    58.               [b]break[/b];
    59.          [b]case[/b] DATAHEADER:
    60.             pos=s.indexOf("filename=");
    61.             [b]if[/b] (pos==-1)
    62.             {                           //将表单域的名字解析出来
    63.               pos=s.indexOf("name=");
    64.               pos+="name=".length()+1;
    65.               s=s.substring(pos);
    66.               [b]int[/b] l=s.length();
    67.               s=s.substring(0,l-1);
    68.               fieldname=s;
    69.               state=FIELDDATA;
    70.             }
    71.             [b]else[/b]
    72.             {                           //将文件名解析出来
    73.               String temp=s;
    74.               pos=s.indexOf("filename=");
    75.               pos+="filename=".length()+1;
    76.               s=s.substring(pos);
    77.               [b]int[/b] l=s.length();
    78.               s=s.substring(0,l-1);
    79.               pos=s.lastIndexOf("");
    80.               s=s.substring(pos+1);
    81.               filename=s;
    82.                                        //从字节数组中取出文件数组
    83.               pos=byteIndexOf(b,temp,0);
    84.               b=subBytes(b,pos+temp.getBytes().length+2,b.length);//去掉前面的部分
    85.               s=reqbuf.readLine();
    86.               b=subBytes(b,s.getBytes().length+4,b.length);
    87.               pos=byteIndexOf(b,boundary,0);
    88.               b=subBytes(b,0,pos-1);
    89.               File f=[b]new[/b] File(formfields.get("FilePath")+""+filename);  //写入文件
    90.               DataOutputStream fileout=[b]new[/b] DataOutputStream([b]new[/b] FileOutputStream(f));
    91.               fileout.write(b,0,b.length-1);
    92.               filesize=b.length-1;
    93.               state=FILEDATA;
    94.             }
    95.             [b]break[/b];
    96.          [b]case[/b] FIELDDATA:
    97.             s=reqbuf.readLine();
    98.             fieldvalue=s;
    99.             formfields.put(fieldname,fieldvalue);
    100.             state=NONE;
    101.             [b]break[/b];
    102.          [b]case[/b] FILEDATA:
    103.             [b]while[/b]((!s.startsWith(boundary))&&(!s.startsWith(lastboundary)))
    104.             {
    105.                s=reqbuf.readLine();
    106.                [b]if[/b] (s.startsWith(boundary))
    107.                {
    108.                   state=DATAHEADER;
    109.                   [b]break[/b];
    110.                }
    111.             }
    112.             [b]break[/b];
    113.       }
    114.     }
    115.     //指定输出类型
    116.     response.setContentType("text/html;charset=gb2312");
    117.     PrintWriter out =response.getWriter();
    118.     out.println("<html>");
    119.     out.println("<head><title>文件上传结果</title></head>");
    120.     out.println("<body>");
    121.     out.println("<h1>文件上传结果</h1><hr>");
    122.     out.println("ID为"+formfields.get("FileID")+"的文件"+filename+"已经上传!"+
    123.                 "文件长度为:"+filesize+"字节");
    124.     out.println("</body></html>");
    125.     out.close();
    126.   }

    127.   //Get Servlet information
    128.   [b]public[/b] String getServletInfo() {
    129.     [b]return[/b] "UploadServlet.UploadServlet Information";
    130.   }

    131.   //字节数组中的INDEXOF函数,与STRING类中的INDEXOF类似
    132.   [b]private[/b] [b]static[/b] [b]int[/b] byteIndexOf([b]byte[/b][] b,String s,[b]int[/b] start)
    133.   {
    134.       [b]return[/b] byteIndexOf(b,s.getBytes(),start);
    135.   }

    136.   //字节数组中的INDEXOF函数,与STRING类中的INDEXOF类似
    137.   [b]private[/b] [b]static[/b] [b]int[/b] byteIndexOf([b]byte[/b][] b,[b]byte[/b][] s,[b]int[/b] start)
    138.   {
    139.      [b]int[/b] i;
    140.      [b]if[/b](s.length==0)
    141.      {
    142.        [b]return[/b] 0;
    143.      }
    144.      [b]int[/b] max=b.length-s.length;
    145.      [b]if[/b](max<0)
    146.         [b]return[/b] -1;
    147.      [b]if[/b](start>max)
    148.         [b]return[/b] -1;
    149.      [b]if[/b] (start<0)
    150.         start=0;
    151.     search:
    152.      [b]for[/b](i=start;i<=max;i++)
    153.      {
    154.         [b]if[/b] (b[i]==s[0])
    155.         {
    156.            [b]int[/b] k=1;
    157.            [b]while[/b](k<s.length)
    158.            {
    159.              [b]if[/b](b[k+i]!=s[k])
    160.              {
    161.                 [b]continue[/b] search;
    162.              }
    163.              k++;
    164.            }
    165.            [b]return[/b] i;
    166.         }
    167.      }
    168.      [b]return[/b] -1;
    169. }

    170. //用于从一个字节数组中提取一个字节数组
    171. [b]private[/b] [b]static[/b] [b]byte[/b][] subBytes([b]byte[/b][] b,[b]int[/b] from,[b]int[/b] end)
    172. {
    173.     [b]byte[/b][] result=[b]new[/b] [b]byte[/b][end-from];
    174.     System.arraycopy(b,from,result,0,end-from);
    175.     [b]return[/b] result;
    176. }

    177. //用于从一个字节数组中提取一个字符串
    178. [b]private[/b] [b]static[/b] String subBytesString([b]byte[/b][] b,[b]int[/b] from,[b]int[/b] end)
    179. {
    180.    [b]return[/b] [b]new[/b] String(subBytes(b,from,end));
    181. }

    182. }
    183.                         
    复制代码

            
          
          
         
    2、辅助上传使用的首页:upload.HTML
         

         

          
          
            
          
    1. <html>

    2. <head>
    3. <meta http-equiv="Content-Language" content="zh-cn">
    4. <meta name="GENERATOR" content="Microsoft FrontPage 5.0">
    5. <meta name="ProgId" content="FrontPage.Editor.Document">
    6. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    7. <title>上传文件</title>
    8. </head>

    9. <body>

    10. <table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse"
    11.   bordercolor="#111111" width="100%" id="AutoNumber1">
    12.   <tr>
    13.     <td width="15%"> </td>
    14.     <td width="80%">
    15.     <table border="0" cellpadding="10" cellspacing="10" style="border-collapse: collapse"
    16.        bordercolor="#111111" width="100%" id="AutoNumber5">
    17.       <tr>
    18.         <td width="100%"><b><font face="黑体">全文辅助工具之一:上传文件接收</font></b></td>
    19.       </tr>
    20.       <tr>
    21.         <td width="100%">
    22.         <p align="right"><font color="#FF0000" size="2">作者:qixiaorui</font></td>
    23.       </tr>
    24.     </table>
    25.     </td>
    26.     <td width="5%"> </td>
    27.   </tr>
    28.   <tr>
    29.     <td width="15%"> </td>
    30.     <td width="80%">
    31.     <table border="1" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111"
    32.         width="100%" id="AutoNumber2">
    33.       <tr>
    34.         <td width="100%">
    35.         <form method="POST" enctype="multipart/form-data" action="http://127.0.0.1:8080/upload">
    36.           <table border="0" cellpadding="10" cellspacing="10" style="border-collapse: collapse"
    37.                         bordercolor="#111111" width="100%" id="AutoNumber3">
    38.             <tr>
    39.               <td width="100%" bgcolor="#00FFFF">
    40.               <p align="center"><font face="华文仿宋" color="#000080"><b>
    41.               --------------------------------- 上 传 文 件
    42.               ----------------------------------</b></font></td>
    43.             </tr>
    44.             <tr>
    45.               <td width="100%">
    46.               <table border="0" cellpadding="3" cellspacing="3" style="border-collapse: collapse"
    47.                             bordercolor="#111111" width="100%" id="AutoNumber4">
    48.                 <tr>
    49.                   <td width="27%">请输入服务器路径:</td>
    50.                   <td width="73%"><input type="text" name="FilePath" size="52">   
    51.                   如: c:aa</td>
    52.                 </tr>
    53.                 <tr>
    54.                   <td width="27%">请输入操作ID:</td>
    55.                   <td width="73%"><input type="text" name="FileID" size="52"></td>
    56.                 </tr>
    57.                 <tr>
    58.                   <td width="27%">请输入文件路径:</td>
    59.                   <td width="73%"><input type="file" name="FileData" size="41"></td>
    60.                 </tr>
    61.               </table>
    62.               </td>
    63.             </tr>
    64.             <tr>
    65.               <td width="100%">
    66.               <input type="submit" value="提交" name="uploadfile">   
    67.               <input type="reset" value="重置" name="B2"></td>
    68.             </tr>
    69.           </table>
    70.         </form>
    71.         </td>
    72.       </tr>
    73.     </table>
    74.     </td>
    75.     <td width="5%"> </td>
    76.   </tr>
    77.   <tr>
    78.     <td width="15%"> </td>
    79.     <td width="80%"> </td>
    80.     <td width="5%"> </td>
    81.   </tr>
    82. </table>

    83. </body>

    84. </html>

    85.                         
    复制代码

            
          
          
         
    3、部署描述文件中添加如下内容(web.xml):
         

         

          
          
            
          
    1. <servlet>
    2. <servlet-name>UploadServlet</servlet-name>
    3.     <servlet-class>quanwen.UploadServlet</servlet-class>
    4. </servlet>
    5. <servlet-mapping>
    6.     <servlet-name>UploadServlet</servlet-name>
    7.     <url-pattern>/upload/*</url-pattern>
    8. </servlet-mapping>
    复制代码

            
          
          
         

          
          
          
             
             

             
             

             
             
          
          
         

         

         
         
       
      


    源码下载:http://file.javaxxz.com/2014/10/10/070007359.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-16 04:10 , Processed in 0.354767 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表