文件上传 - 无组件上传

 

 

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;
           }
      }
   }
} 
 

 

 

你可能感兴趣的:(eclipse,tomcat,应用服务器,jsp,servlet)