本人正在做一个电子商务系统的作业,寻求图片上传的例子!例如用户注册可以上传头像,更新商品可以上传商品图片。

解决方案 »

  1.   

    package bing.up;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.HttpServlet;
    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 UpServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
           
        public UpServlet() {
            super();
        } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


     //获得磁盘文件条目工厂  
            DiskFileItemFactory factory = new DiskFileItemFactory();
            //获取文件需要上传到的路径  
            String path =   request.getRealPath("/");  
            
            //String path =   "D:"+File.separator;
            
            System.out.println("path:"+path);
            
            //如果没以下两行设置的话,上传大的 文件 会占用 很多内存,  
            //设置暂时存放的 存储室 , 这个存储室,可以和 最终存储文件 的目录不同  
            /** 
             * 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上,  
             * 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem 格式的  
             * 然后再将其真正写到 对应目录的硬盘上 
             */  
            factory.setRepository(new File(path));  
            //设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室  
            factory.setSizeThreshold(1024*1024) ;  
              
            //高水平的API文件上传处理  
            ServletFileUpload upload = new ServletFileUpload(factory); 
            
            
            InputStream in = null;
            OutputStream out = null;
            //可以上传多个文件  
            try {
    List<FileItem> list = (List<FileItem>)upload.parseRequest(request);
    for(FileItem item:list){
    System.out.println("isFormField:"+item.isFormField());
    if(item.isFormField()){
                        //获取用户具体输入的字符串 ,名字起得挺好,因为表单提交过来的是 字符串类型的  
                        String value = item.getString() ;  
                          
                        System.out.println("value:"+value); 
    }else{
     /** 
                         * 以下三步,主要获取 上传文件的名字 
                         */  
                        //获取路径名  
                        String value = item.getName() ;  
                        //索引到最后一个反斜杠  
                        int start = value.lastIndexOf("\\");  
                        //截取 上传文件的 字符串名字,加1是 去掉反斜杠,  
                        String filename = value.substring(start+1);  
                          
                        System.out.println("filename:"+filename);
                          
                        //真正写到磁盘上  
                        //它抛出的异常 用exception 捕捉  
                          
                        //item.write( new File(path,filename) );//第三方提供的  
                        
                        //手动写的  
                        
                        in = item.getInputStream();
                        
                        File file = new File(path,filename);
                        
                        if(file.exists()){
                         boolean deletefile = file.delete();
                         System.out.println("deletefile:"+deletefile);
                        }
                        out = new FileOutputStream(file);
                        
                        int length = 0 ;  
                        byte [] buf = new byte[1024] ;  
                          
                        System.out.println("获取上传文件的总共的容量:"+item.getSize());  
      
                        // in.read(buf) 每次读到的数据存放在   buf 数组中  
                        while( (length = in.read(buf) ) != -1)  
                        {  
                            //在   buf 数组中 取出数据 写到 (输出流)磁盘上 
                            out.write(buf, 0, length);  
                              
                        }  
                         
    }
    }
    } catch (FileUploadException e) {
    e.printStackTrace();
    }finally{
    if(in!=null){
    try{
    in.close();
    }catch(Exception e){
    e.printStackTrace();
    }
    }
    if(null!=out){
    try{
    out.close();
    }catch(Exception e){
    e.printStackTrace();
    }
    }
    }
    } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    this.doGet(request, response);
    }}
    这是个文件上传的servlet,用的是smartupload,jar包自己去网上下吧,上传文件的保存路径可以自己设