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

来源:互联网 发布:傅园慧网络直播回看 编辑:程序博客网 时间:2024/05/17 01:43
一、文件上传
        思想:图片是以流的方式进行读取,上传的图片存放在服务器端的某个文件夹中,数据库中保存的是上传的图片的地址。
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)方法同上
原创粉丝点击