一、文件上传
        思想:图片是以流的方式进行读取,上传的图片存放在服务器端的某个文件夹中,数据库中保存的是上传的图片的地址。
1.ActionForm(userForm)
    
private FormFile p_w_picpath;//用于封装从jsp页面传过来的文本类型的属性
2.pojo(User)
    
private String path;//用于存放上传图片的地址,数据库中需要添加存放该地址的字段
3.jsp
    
<html:form action=" " enctype="multipart/form-data">//form设置了enctype属性后就是二进制传输数据了
    <html:file property="p_w_picpath"></html:file>
    
</html:form>
4.action
    String basePath
=this.getServlet().getServletContext().getRealPath("/");//获得服务器的基路径
    String path="/uploadImage/"+userService.picturePath(userForm.getImage());//上传图片保存的相对路径,图片                                                                                                    名通过userService中的picturePath方法进行处理
    String  endString=userForm.getImage().getFileName().substring
        (userForm.getImage().getFileName().lastIndexOf(
".")+1);//获取图片的后缀名
5.service(userService)
    
if("jpg".equals(endString)||"png".equals(endString)||"gif".equals(endString)||"JPG".equals(endString)||
        
"PNG".equals(endString)||"GIF".equals(endString)){//限制上传图片的类型
       userDAO.saveImage(p_w_picpath,basePath,path);//保存图片
       user.setPath(path);//将上传图片的路径(地址)进库
    }
else{
       user.setPath(
" ");//上传的图片不符合要求,在数据库中设置为空
    }

6.dao(userDAO)
    
public String picturePath(FormFile p_w_picpath){//处理上传的图片名,UUIDGenerator详见相关日志
       String filename=" ";//初始化变量
       UUIDGenerator g=new UUIDGenerator();//创建UUIDGenerator类的一个对象
       filename=p_w_picpath.getFileName();//将图片的文件名赋值给变量
       if(filename.length()>0){
          filename
=filename.substring(filename.lastIndexOf("."));//将文件名除了后缀名的部分赋给filename变量
        }

       filename
=(String)g.generate()+filename;//对上传的图片文件名进行处理,以免出现上传的图片名相同
       return filename;
    }


    
public void saveImage(FormFile p_w_picpath,String basePath,String path) throws IOException{//上传图片
        FileOutputStream fos=null;//文件输出流
        BufferedInputStream in=null;//缓冲的输入流
        BufferedOutputStream out=null;//缓冲的输出流
        try {
            fos
=new FileOutputStream(basePath+path);//创建一个向指定File对象表示的文件中写入数据的输出流
            in=new BufferedInputStream(p_w_picpath.getInputStream());//创建BufferedInputStream并保存其参数,即输入流                                                                                                    in,以便将来使用
            out=new BufferedOutputStream(fos);//创建一个新的缓冲输出流,以将数据写入指定的基础输出流
            byte[] buf=new byte[8192];//创建一个字节缓冲数组,用于指定每次写入的字节大小(8192=8k)
            int readSize;
            
while((readSize=in.read(buf))!=-1){//判断缓冲数组中是否还有数据
                out.write(buf, 0, readSize);//将指定buf数组中从偏移量0开始的readSize个字节写入此缓冲的输出流
                out.flush();//关闭缓冲的输出流
            }

        }
 catch (FileNotFoundException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }
finally{
            
if(out!=null){
                
try {
                    out.close();
                }
 catch (RuntimeException e) {
                    
// TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }

            
if(in!=null){
                
try {
                    in.close();
                }
 catch (RuntimeException e) {
                    
// TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }

            
if(fos!=null){
                
try {
                    fos.close();
                }
 catch (RuntimeException e) {
                    
// TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }

        }

    }


二、文件删除
    思路:上传的文件存放在某个文件夹中,该图片的地址存放在数据库中,因此,在删除图片的时候,不仅要删除它在数据库中的地址,而且还要删除在文件夹中的文件,删除图片之前要获取该图片的绝对路径。
1.action(userAction)
    String basepath
=this.getServlet().getServletContext().getRealPath("/");//获得服务器基路径
2.service(userService)
    userDAO.deleteImage(uId,basepath);
//删除图片
    userDAO.deleteUser(uId);//删除图片在数据库中的路径
3.dao(userDAO)
    
public void deleteImage(Integer uId,String basepath){
       User user
=this.getUserById(uId);//取出某个用户对象(获得图片的相对路径)
       String path=user.getPath();//将图片的相对路径赋值
       if(path!=null){
          File file
=new File(basepath+path);//根据绝对路径创建一个文件对象
          file.delete();//删除文件
        }

    }


三、修改文件
    思路:先将原来的图片删除,然后重新上传一张图片
1.jsp(edit.jsp)
    
<html:hidden property="path"/>//获得原来图片的路径放在隐藏域中(尤其要注意)
    <html:file property="p_w_picpath"/>
2.action(userAction)
    String basepath
=this.getServlet().getServletCotext().getRealPath("/");//获得服务器基路径
    String path=null;
    
if(userForm.getImage().getFileSize()>0){//判断是否需要修改图片
       path="/uploadImage/"+userForm.getImage();
    }

    userService.modify(basepath,path,userForm.getImage());
//调用修改的方法
3.service(userService)
    
if(user.getPath()!=null&&path!=null){//需要修改图片的情况
       userDAO.deleteImage(basepath+path);//根据绝对路径删除图片
       userDAO.saveImage(p_w_picpath,basepath,path);//根据相对路径重新上传一张图片
       user.setPath(path);//将新路径保存到user对象中
    }

    userDAO.modify(id,user);
4.dao(userDAO)方法同上