Struts实现单文件上传、修改、删除(以图片为例)

Struts实现单文件上传、修改、删除(以图片为例)

 

一、文件上传
        思想:图片是以流的方式进行读取,上传的图片存放在服务器端的某个文件夹中,数据库中保存的是上传的图片的地址。
1 .ActionForm(userForm)
    
private  FormFile image; // 用于封装从jsp页面传过来的文本类型的属性
2 .pojo(User)
    
private  String path; // 用于存放上传图片的地址,数据库中需要添加存放该地址的字段
3 .jsp
    
< html:form action = "   "  enctype = " multipart/form-data " > // form设置了enctype属性后就是二进制传输数据了
     < html:file property = " image " ></ 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(image,basePath,path);//保存图片
       user.setPath(path);//将上传图片的路径(地址)进库
    }
else {
       user.setPath(
" ");//上传的图片不符合要求,在数据库中设置为空
    }

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

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


    
public   void  saveImage(FormFile image,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(image.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 = " image " />
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(image,basepath,path);//根据相对路径重新上传一张图片
       user.setPath(path);//将新路径保存到user对象中
    }

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

 

你可能感兴趣的:(Struts实现单文件上传、修改、删除(以图片为例))