package com.chao.action; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Iterator; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; 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.FileItemFactory; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class MyUpload extends HttpServlet { private static final long serialVersionUID = 1L; public void init(){ System.out.println("MyUpload is init ... "); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //response.setContentType("text/html; charset=UTF-8"); //response.setCharacterEncoding("UTF-8"); // Check that we have a file upload request boolean isMultipart = ServletFileUpload.isMultipartContent(request); // Create a factory for disk-based file items FileItemFactory factory = new DiskFileItemFactory(); // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); // Parse the request try { List items = upload.parseRequest(request); Iterator iter = items.iterator(); if (iter.hasNext()) {// if or while FileItem item = (FileItem) iter.next(); if (!item.isFormField()) { String name = item.getName(); SimpleDateFormat df = new SimpleDateFormat("yyyy_MM_dd_hh_mm_ss"); String date = df.format(Calendar.getInstance().getTime()); String name2 = date + "_" + new String(name.getBytes("GBK"),"UTF-8"); long size = item.getSize(); String contentType = item.getContentType(); item.write(new File("f:\\temp\\uploadfile\\" + name2)); } } } catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e){ e.printStackTrace(); } } }
其中item是用DiskFileItem
用了common的组件,如何不用组件,通过servlet直接读取?
如果只有一个field,貌似可以直接获得输入流然后写入就可以了,额,先试试行不行
new 一个server之后,会自动建立一个目录workspace\Servers\Tomcat v5.5 Server @ localhost-config,里面的几个文件,来自tomcat的conf目录 一旦服务运行,将自动在workspace\.metadata\.plugins\org.eclipse.wst.server.core下建立一个tmp0(如果有多个,则tmp1,tmp2....)目录里面其实就是一个tomcat,其conf目录中的配置从workspace\Servers\Tomcat v5.5 Server @ localhost-config中同步而来. 注意事项: 1.一旦Server建立完成,如需修改配置文件,生效的是workspace\.metadata\.plugins\org.eclipse.wst.server.core中的文件,而不是去TOMCAT_HOME/conf中的文件. 2.publish的时候,自动同步,即将配置文件拷贝到tmp0/conf中.如果出现不一致情况,请检查tmp0/conf中的配置文件是否同步成功. 3.某些情况下Server可能无法启动,这就需要删除Server之后重新添加,而这样一来,workspace\Servers\Tomcat v5.5 Server @ localhost-config中的配置文件就都重写了.建议修改方法:首先修改TOMCAT_HOME/conf中的文件,然后拷贝到workspace\Servers\Tomcat v5.5 Server @ localhost-config,再通过publish同步更新. 4.wtp目前不支持context.Xml,所以,如果配置了数据库连接池,需要手工将context.Xml拷贝到workspace\Servers\Tomcat v5.5 Server @ localhost-config下. 程序部署 war包:是做好一个web应用后,通常是网站,打成包部署到容器中。 jar包:通常是开发时要引用通用类,打成包便于存放管理。 ear包:企业级应用,通常是EJB打成ear包。 1、将war文件拷贝到tomcat目录\webapps\下。重启tomcat,ok(不用改server.xml也ok了)。 但WSAD在设置java构建路径添加外部jar时,需手动将该jar文件拷贝到Web项目的WebContent\WEB-INF\lib下,否则在运行Web项目时或在打成war包时,会有问题。 war解释 1..WAR其实就是.zip格式,你用WINZIP都可以做一个,想压缩成.zip再把后缀名改为war就行了,只不过需要注意压缩的层次和相应的配置文件的位置。一般都用开发工具的生成向导做一个。 2. war包一般就是一个用于发布的文件,一般是不会在其他工程中导入的,只有JAR包才会导入到其它工程中,在工程属性里面做 3.war文件类似一个压缩包,是整合web应用用的,你要是将war导入你的工程,看你是什么目的,如果想用到里面的类的话,就直接在工程的属性里面导入,不过只能用到里面的class文件(就是你说的普通的类)。如果想在别的war包里调用这个war包,就要在当前war包的属性里面把你要打的包勾上,这样就可以打成一个war包了,你就可以调用了。 不过真正的做法是把你的war,jar打到一个ear包里,一起发布。 4.war就像一个目录一样存在。 war内部使用相对路径或者目录名(这个名字将来是war的名字)来使用。 注意在压缩的时候压缩目录下的文件,不要直接压缩目录。(压成zip改名估计也可以) 这样应该就没问题了
写的乱,什么都有,呵呵,看到有用的就留下来。
firebug post请求看到上传的内容
Content-Type: multipart/form-data; boundary=---------------------------83132883832517 Content-Length: 1435 -----------------------------83132883832517 Content-Disposition: form-data; name="myfile"; filename="Vote.wsdl" Content-Type: application/octet-stream <?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions name="VoteService" .......
boundary分界线,之后的就是post传递的内容,改成二进制文件试一下。
Content-Type: multipart/form-data; boundary=---------------------------203421646730000 Content-Length: 621082 -----------------------------203421646730000 Content-Disposition: form-data; name="myfile"; filename="Tulips.jpg" Content-Type: image/jpeg ÿØÿà�JFIF��`�`��ÿáExif��MM�*����2�������bGF�������GI�����?���������v��������ê���Ò����i�
这次都是二进制数据了,在servlet中如何得到这些数据呢?
额,多句嘴,<input type="file" id="file" name="myfile2"/> file必须有name属性
还没找到方法,一会继续找
http://zhidao.baidu.com/question/110562971.html 这里来的
JSP页面部分: <%@ page contentType="text/html;charset=GB2312" %> <%@ page import="tom.jiafei.UpFile" %> <jsp:useBean id="upFile" class="tom.jiafei.UpFile" scope="session" /> <HTML><BODY> <P>选择要上传的文件:<BR> <FORM action="" method="post" ENCTYPE="multipart/form-data"> <INPUT type=FILE name="boy" size="45"> <BR> <INPUT type="submit" name ="g" value="提交"> </FORM> <% upFile.setRequest(request); upFile.setSession(session); %> <jsp:getProperty name="upFile" property="upFileMessage"/> <P>如果上传的是图像文件,可单击超链接查看图像: <BR><A href="show.jsp"> 查看图像</A> </BODY></HTML> 处理类: package tom.jiafei; import java.io.*; import javax.servlet.http.*; public class UpFile { HttpServletRequest request; HttpSession session; String upFileMessage=""; public void setRequest(HttpServletRequest request) { this.request=request; } public void setSession(HttpSession session) { this.session=session; } public String getUpFileMessage() { String fileName=null; try{ String tempFileName=(String)session.getId();//客户的session的id File f1=new File("D:/tomcat614/Tomcat 6.0/webapps/file/upfile",tempFileName); FileOutputStream o=new FileOutputStream(f1); InputStream in=request.getInputStream(); byte b[]=new byte[10000]; int n; while( (n=in.read(b))!=-1) { o.write(b,0,n); } o.close(); in.close(); RandomAccessFile random=new RandomAccessFile(f1,"r"); int second=1; //读出f1的第2行,析取出上传文件的名字: String secondLine=null; while(second<=2) { secondLine=random.readLine(); second++; } //获取第2行中目录符号'\'最后出现的位置 int position=secondLine.lastIndexOf('\\'); //客户上传的文件的名字是: fileName=secondLine.substring(position+1,secondLine.length()-1); byte cc[]=fileName.getBytes("ISO-8859-1"); fileName=new String(cc); session.setAttribute("Name",fileName);//供show.jsp页面使用 random.seek(0); //再定位到文件f1的开头。 //获取第4行回车符号的位置: long forthEndPosition=0; int forth=1; while((n=random.readByte())!=-1&&(forth<=4)) { if(n=='\n') { forthEndPosition=random.getFilePointer(); forth++; } } //根据客户上传文件的名字,将该文件存入磁盘: File f2= new File("D:/tomcat614/Tomcat 6.0/webapps/file/upfile",fileName); //File f2= new File("D:/aaa",fileName); RandomAccessFile random2=new RandomAccessFile(f2,"rw"); //确定出文件f1中包含客户上传的文件的内容的最后位置,即倒数第6行。 random.seek(random.length()); long endPosition=random.getFilePointer(); long mark=endPosition; int j=1; while((mark>=0)&&(j<=6)) { mark--; random.seek(mark); n=random.readByte(); if(n=='\n') { endPosition=random.getFilePointer(); j++; } } //将random流指向文件f1的第4行结束的位置: random.seek(forthEndPosition); long startPoint=random.getFilePointer(); //从f1读出客户上传的文件存入f2(读取从第4行结束位置和倒数第6行之间的内容) while(startPoint<endPosition-1) { n=random.readByte(); random2.write(n); startPoint=random.getFilePointer(); } random2.close(); random.close(); f1.delete(); //删除临时文件 upFileMessage=fileName+" Successfully UpLoad"; return upFileMessage; } catch(Exception exp) { if(fileName!=null) { upFileMessage=fileName+" Fail to UpLoad"; return upFileMessage; } else { upFileMessage=""; return upFileMessage; } } } }