疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

基于SSH框架:文件上传


 

 
文件上传表单如何处理
 
注意的点: 
method=”post” 
enctype=”multipart/form-data” 一定要写 
name=”upload” name的值只能写upload这是Struts规定的,不然找不到这个属性注入
 
<FORM id=form1 name=form1 action="${pageContext.request.contextPath }/customer_save.action" method="post" enctype="multipart/form-data">
 
                                <td>上传资质:</td>
                                <td>
                                    <input type="file" name="upload" />
                                </td>
 
</form>
 
Struts拦截器辅助文件上传 
Struts有拦截器可以辅助解析上传的文件,只要在类中提供Struts规定的相关的属性和对应的set方法,Struts就可以自动注入上传的文件信息 
Struts2框架的使用拦截器完成了文件上传,并且底层使用也是FileUpload开源的组件。 
* 提供 FileUpload 拦截器,用于解析 multipart/form-data 编码格式请求,解析上传文件的内容 
* fileUpload拦截器 默认在 defaultStack 栈中, 默认会执行的
 
    * 在Action中编写文件上传,需要定义三个属性
        > 文件类型File ,属性名与表单中file的name属性名一致.
        > 字符串类型String , 属性名:前段是name属性名一致 + ContentType;
        > 字符串类型String , 属性名:前段是name属性名一致+FileName;
 
        > 最后需要为上述的三个属性提供set方法。
        > 可以通过FileUtils提供 copyFile 进行文件复制,将上传文件 保存到服务器端 
 
/**
     * 文件的上传,需要在CustomerAction类中定义成员的属性,命名是有规则的!!
     * private File upload;     // 表示要上传的文件
     * private String uploadFileName;   表示是上传文件的名称(没有中文乱码,已经处理过了)
     * private String uploadContentType;    表示上传文件的MIME类型
     * 提供set方法,拦截器就注入值了
     */
    // 要上传的文件
    private File upload;
    // 文件的名称
    private String uploadFileName;
    // 文件的MIME的类型
    private String uploadContentType;
 
    public void setUpload(File upload) {
        this.upload = upload;
    }
    public void setUploadFileName(String uploadFileName) {
        this.uploadFileName = uploadFileName;
    }
    public void setUploadContentType(String uploadContentType) {
        this.uploadContentType = uploadContentType;
    }
 
Struts拦截器设置上传文件的类型已经大小
 
文件上传中存在的问题 
* 先配置input逻辑视图 /error.jsp 
* 在页面中显示错误信息
 
    * 文件上传的总大小默认值是2M,如果超过了2M,程序会报出异常。可以使用<s:actionError>来查看具体信息!
        > 解决总大小的设置,找到常量:
            * struts.multipart.parser=jakarta       -- 默认文件上传解析器,就是FileUpload组件
            * struts.multipart.saveDir=             -- 文件上传的临时文件存储目录
            * struts.multipart.maxSize=2097152      -- 文件上传的最大值(总大小),默认是2M
 
        > 可以在struts.xml中设置常量,修改文件上传的默认总大小!!!
            * <constant name="struts.multipart.maxSize" value="5000000"></constant>
 
文件命名的唯一性
 
/**
     * 传入文件的名称,返回的唯一的名称
     * 例如:gril.jpg  返回sdjsljfsjdl.jpg
     * @param filename
     * @return
     */
    public static String getUUIDName(String filename){
        // 先查找
        int index = filename.lastIndexOf(".");
        // 截取
        String lastname = filename.substring(index, filename.length());
        // 唯一 字符串  fsd-sfsdf-sfsd-sdfsd
        String uuid = UUID.randomUUID().toString().replace("-", "");
        return uuid+lastname;
    }
 
文件存放位置
 
存放在项目目录下:不推荐,因为项目一重新加载,文件会丢失 
存放在任意盘符下:可行,但是不易于浏览器直接访问,除非设置虚拟路径 
存放在服务器路径下:推荐,可以通过localhost/文件夹/文件名+后缀,直接访问 
存放在数据库的只是文件的绝对路径,通过绝对路径查找文件。 
删除文件的方法
 
        // 删除文件
        File file = new File(filepath);
        if(file.exists()){
            file.delete();
        }