TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
本文演示了用户如何从本地上传一个文件到服务器的指定目录。
1、代码
- [b]package[/b] quanwen;
-
- [b]import[/b] javax.servlet.*;
- [b]import[/b] javax.servlet.http.*;
- [b]import[/b] java.io.*;
- [b]import[/b] java.util.*;
-
- [b]public[/b] [b]class[/b] UploadServlet [b]extends[/b] HttpServlet {
-
- //Initialize global variables
- [b]public[/b] [b]void[/b] init(ServletConfig config) [b]throws[/b] ServletException {
- super.init(config);
- }
-
- //Process the HTTP Post request
- [b]public[/b] [b]void[/b] doPost(HttpServletRequest request, HttpServletResponse response)
- [b]throws[/b] ServletException, IOException {
- [b]final[/b] [b]int[/b] NONE=0;
- [b]final[/b] [b]int[/b] DATAHEADER=1;
- [b]final[/b] [b]int[/b] FILEDATA=2;
- [b]final[/b] [b]int[/b] FIELDDATA=3;
- //将请求消息的实体送到b变量中
- [b]int[/b] TotalBytes=request.getContentLength();
- [b]byte[/b][] b=[b]new[/b] [b]byte[/b][TotalBytes];
- String contentType=request.getContentType();//请求消息类型
- String fieldname=""; //表单域的名称
- String fieldvalue=""; //表单域的值
- String filename=""; //文件名
- String boundary=""; //分界符
- String lastboundary=""; //结束符
- [b]int[/b] filesize=0; //文件长度
- Hashtable formfields=[b]new[/b] Hashtable();
- [b]int[/b] pos=contentType.indexOf("boundary=");
- String fileID; //上传的文件ID
- [b]if[/b](pos!=-1) //取得分界符和结束符
- {
- pos+="boundary=".length();
- boundary="--"+contentType.substring(pos);
- lastboundary=boundary+"--";
- }
- [b]int[/b] state=NONE;
- //得到数据输入流reqbuf
- DataInputStream in=[b]new[/b] DataInputStream(request.getInputStream());
- in.readFully(b);
- in.close();
- String reqContent=[b]new[/b] String(b);
- BufferedReader reqbuf=[b]new[/b] BufferedReader([b]new[/b] StringReader(reqContent));
- [b]boolean[/b] flag=[b]true[/b];
- [b]int[/b] i=0;
- [b]while[/b](flag==[b]true[/b])
- {
- String s=reqbuf.readLine();
- [b]if[/b]((s==lastboundary)||(s==[b]null[/b])) [b]break[/b];
- [b]switch[/b](state)
- {
- [b]case[/b] NONE:
- [b]if[/b] (s.startsWith(boundary))
- {
- state=DATAHEADER;
- i+=1;
- }
- [b]break[/b];
- [b]case[/b] DATAHEADER:
- pos=s.indexOf("filename=");
- [b]if[/b] (pos==-1)
- { //将表单域的名字解析出来
- pos=s.indexOf("name=");
- pos+="name=".length()+1;
- s=s.substring(pos);
- [b]int[/b] l=s.length();
- s=s.substring(0,l-1);
- fieldname=s;
- state=FIELDDATA;
- }
- [b]else[/b]
- { //将文件名解析出来
- String temp=s;
- pos=s.indexOf("filename=");
- pos+="filename=".length()+1;
- s=s.substring(pos);
- [b]int[/b] l=s.length();
- s=s.substring(0,l-1);
- pos=s.lastIndexOf("");
- s=s.substring(pos+1);
- filename=s;
- //从字节数组中取出文件数组
- pos=byteIndexOf(b,temp,0);
- b=subBytes(b,pos+temp.getBytes().length+2,b.length);//去掉前面的部分
- s=reqbuf.readLine();
- b=subBytes(b,s.getBytes().length+4,b.length);
- pos=byteIndexOf(b,boundary,0);
- b=subBytes(b,0,pos-1);
- File f=[b]new[/b] File(formfields.get("FilePath")+""+filename); //写入文件
- DataOutputStream fileout=[b]new[/b] DataOutputStream([b]new[/b] FileOutputStream(f));
- fileout.write(b,0,b.length-1);
- filesize=b.length-1;
- state=FILEDATA;
- }
- [b]break[/b];
- [b]case[/b] FIELDDATA:
- s=reqbuf.readLine();
- fieldvalue=s;
- formfields.put(fieldname,fieldvalue);
- state=NONE;
- [b]break[/b];
- [b]case[/b] FILEDATA:
- [b]while[/b]((!s.startsWith(boundary))&&(!s.startsWith(lastboundary)))
- {
- s=reqbuf.readLine();
- [b]if[/b] (s.startsWith(boundary))
- {
- state=DATAHEADER;
- [b]break[/b];
- }
- }
- [b]break[/b];
- }
- }
- //指定输出类型
- response.setContentType("text/html;charset=gb2312");
- PrintWriter out =response.getWriter();
- out.println("<html>");
- out.println("<head><title>文件上传结果</title></head>");
- out.println("<body>");
- out.println("<h1>文件上传结果</h1><hr>");
- out.println("ID为"+formfields.get("FileID")+"的文件"+filename+"已经上传!"+
- "文件长度为:"+filesize+"字节");
- out.println("</body></html>");
- out.close();
- }
-
- //Get Servlet information
- [b]public[/b] String getServletInfo() {
- [b]return[/b] "UploadServlet.UploadServlet Information";
- }
-
- //字节数组中的INDEXOF函数,与STRING类中的INDEXOF类似
- [b]private[/b] [b]static[/b] [b]int[/b] byteIndexOf([b]byte[/b][] b,String s,[b]int[/b] start)
- {
- [b]return[/b] byteIndexOf(b,s.getBytes(),start);
- }
-
- //字节数组中的INDEXOF函数,与STRING类中的INDEXOF类似
- [b]private[/b] [b]static[/b] [b]int[/b] byteIndexOf([b]byte[/b][] b,[b]byte[/b][] s,[b]int[/b] start)
- {
- [b]int[/b] i;
- [b]if[/b](s.length==0)
- {
- [b]return[/b] 0;
- }
- [b]int[/b] max=b.length-s.length;
- [b]if[/b](max<0)
- [b]return[/b] -1;
- [b]if[/b](start>max)
- [b]return[/b] -1;
- [b]if[/b] (start<0)
- start=0;
- search:
- [b]for[/b](i=start;i<=max;i++)
- {
- [b]if[/b] (b[i]==s[0])
- {
- [b]int[/b] k=1;
- [b]while[/b](k<s.length)
- {
- [b]if[/b](b[k+i]!=s[k])
- {
- [b]continue[/b] search;
- }
- k++;
- }
- [b]return[/b] i;
- }
- }
- [b]return[/b] -1;
- }
-
- //用于从一个字节数组中提取一个字节数组
- [b]private[/b] [b]static[/b] [b]byte[/b][] subBytes([b]byte[/b][] b,[b]int[/b] from,[b]int[/b] end)
- {
- [b]byte[/b][] result=[b]new[/b] [b]byte[/b][end-from];
- System.arraycopy(b,from,result,0,end-from);
- [b]return[/b] result;
- }
-
- //用于从一个字节数组中提取一个字符串
- [b]private[/b] [b]static[/b] String subBytesString([b]byte[/b][] b,[b]int[/b] from,[b]int[/b] end)
- {
- [b]return[/b] [b]new[/b] String(subBytes(b,from,end));
- }
-
- }
-
复制代码
2、辅助上传使用的首页:upload.HTML
- <html>
-
- <head>
- <meta http-equiv="Content-Language" content="zh-cn">
- <meta name="GENERATOR" content="Microsoft FrontPage 5.0">
- <meta name="ProgId" content="FrontPage.Editor.Document">
- <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
- <title>上传文件</title>
- </head>
-
- <body>
-
- <table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse"
- bordercolor="#111111" width="100%" id="AutoNumber1">
- <tr>
- <td width="15%"> </td>
- <td width="80%">
- <table border="0" cellpadding="10" cellspacing="10" style="border-collapse: collapse"
- bordercolor="#111111" width="100%" id="AutoNumber5">
- <tr>
- <td width="100%"><b><font face="黑体">全文辅助工具之一:上传文件接收</font></b></td>
- </tr>
- <tr>
- <td width="100%">
- <p align="right"><font color="#FF0000" size="2">作者:qixiaorui</font></td>
- </tr>
- </table>
- </td>
- <td width="5%"> </td>
- </tr>
- <tr>
- <td width="15%"> </td>
- <td width="80%">
- <table border="1" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111"
- width="100%" id="AutoNumber2">
- <tr>
- <td width="100%">
- <form method="POST" enctype="multipart/form-data" action="http://127.0.0.1:8080/upload">
- <table border="0" cellpadding="10" cellspacing="10" style="border-collapse: collapse"
- bordercolor="#111111" width="100%" id="AutoNumber3">
- <tr>
- <td width="100%" bgcolor="#00FFFF">
- <p align="center"><font face="华文仿宋" color="#000080"><b>
- --------------------------------- 上 传 文 件
- ----------------------------------</b></font></td>
- </tr>
- <tr>
- <td width="100%">
- <table border="0" cellpadding="3" cellspacing="3" style="border-collapse: collapse"
- bordercolor="#111111" width="100%" id="AutoNumber4">
- <tr>
- <td width="27%">请输入服务器路径:</td>
- <td width="73%"><input type="text" name="FilePath" size="52">
- 如: c:aa</td>
- </tr>
- <tr>
- <td width="27%">请输入操作ID:</td>
- <td width="73%"><input type="text" name="FileID" size="52"></td>
- </tr>
- <tr>
- <td width="27%">请输入文件路径:</td>
- <td width="73%"><input type="file" name="FileData" size="41"></td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td width="100%">
- <input type="submit" value="提交" name="uploadfile">
- <input type="reset" value="重置" name="B2"></td>
- </tr>
- </table>
- </form>
- </td>
- </tr>
- </table>
- </td>
- <td width="5%"> </td>
- </tr>
- <tr>
- <td width="15%"> </td>
- <td width="80%"> </td>
- <td width="5%"> </td>
- </tr>
- </table>
-
- </body>
-
- </html>
-
-
复制代码
3、部署描述文件中添加如下内容(web.xml):
- <servlet>
- <servlet-name>UploadServlet</servlet-name>
- <servlet-class>quanwen.UploadServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>UploadServlet</servlet-name>
- <url-pattern>/upload/*</url-pattern>
- </servlet-mapping>
复制代码
源码下载:http://file.javaxxz.com/2014/10/10/070007359.zip |
|