package org.test.servlets;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
 public class UploadServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
   static final long serialVersionUID = 1L;
   
 @SuppressWarnings({ "unchecked", "deprecation" })  //注释类型安全
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    DiskFileItemFactory factory=new DiskFileItemFactory();
    //把upload作为临时储存目录 
    String path=request.getRealPath("/upload");
    System.out.print(path);
    factory.setRepository(new File(path));
    
    //设置小于1M的文件放到内存中 大于等于1M的放在磁盘当中
    factory.setSizeThreshold(1024*1024);
     
    ServletFileUpload upload=new ServletFileUpload(factory);
    try {
     //parseRequest 
List<FileItem> list=upload.parseRequest(request);
   
for(FileItem item:list)
{    
//表示表单是一般类型不是file类型
if(item.isFormField())
{
//获得表单name 
String name=item.getFieldName();
String value=item.getString("gbk");
request.setAttribute(name, value);
}
else//表示是文件类型
{  
//获得文件name 不能获得
String name=item.getFieldName();
String value=item.getName();
//获得最后一个反斜杠
            int start=value.lastIndexOf("\\");
            //真正的文件名
String filename=value.substring(start+1);
request.setAttribute(name,filename);

//得到输出流
OutputStream os=new FileOutputStream(new File(path,filename));
//得到输入流
InputStream is=item.getInputStream();

byte[] buffer=new byte[400];//设置缓冲
int length=0;//每次读写长度
while((length=is.read(buffer))>0)//表示里面有内容
{
os.write(buffer,0,length);
}
os.close();
is.close();
}
}


    } catch (FileUploadException e) {
  e.printStackTrace();
}
    //请求转发
    request.getRequestDispatcher("upload/request2.jsp").forward(request,response);
}           
}
在request2.jsp里能显示文件名 但是在项目里的UPLOAD文件夹里始终没有那个我要上传的文件! 请高手指点

解决方案 »

  1.   

    不需要这么复杂吧,用struts2,几行代码搞定
      

  2.   

    不行啊 还是没什么异常 在request2.jsp里也能显示文件的名字  就是再upload文件夹里没有上传的文件
      

  3.   

    文件已经找到了! 
    但是再D:\ProgramFiles\eclipse\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\struts2.0\upload这个目录下 
    这样在项目的upload文件夹里没有这个上传文件!
    怎么才能再项目里的upload文件夹里显示上传的文件呢! 
    我用的是Eclipse开发工具 
    后来我把setRepository也去掉了 很苦恼啊 帮帮我啊!
      

  4.   

    request.getRealPath("/")取得的就是项目的根目录
    path=request.getRealPath("/") + "\\upload\\";楼主可能是Eclipse和tomcat配置有问题,与其这样,还不如自己装个tomcat,把工程放在webapps下测试
      

  5.   

    不用这样弄吧,这里有个:actionFileBean filebean = (FileBean) form;// TODO Auto-generated method stub
    String fileName = filebean.getFileName();
    System.out.println("文件名是:"+fileName);
    int size = filebean.getSize(); // 得到应用程序的上传路径
    String fullPath = this.getServlet().getServletContext().getRealPath(
    "upload");
    System.out.println("fullpath="+fullPath);
    File file = new File(fullPath);
    if (!file.exists())
    file.mkdir();// 如果文件夹不存在,则创建

    try {
    //得到文件输入流

    InputStream is = filebean.getFile().getInputStream();
    //封装为缓冲输入流
    BufferedInputStream bis = new BufferedInputStream(is);

    //创建文件输出流                                //    输入的指定位置     文件名
    FileOutputStream fos = new FileOutputStream(new File(fullPath, fileName));
    //封装为缓冲输出流
    BufferedOutputStream bos = new BufferedOutputStream(fos);

    int block = 2048;//每次操作的最大字节数
    int actual = 0; //每次操作的实际字节数
    byte[] bs = new byte[block]; //字节缓冲
    while((actual = bis.read(bs)) > 0){
    bos.write(bs, 0, actual);
    }
    在form 里面有 private FormFile file;  这个属性,关联页面的 file 
    //关闭流
    bos.close();
    bis.close();
    fos.close();
    is.close();
    } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
      

  6.   

    在form 里面有 private FormFile file;  这个属性,关联页面的 file nnd 这句怎么到那里去了咯