SSH,SSM框架文件上传

一、了解文件上传

1.1        什么是文件上传

将本地文件通过流的形式写到服务器上

1.2        文件上传的技术

  • JspSmartUpload: 其组件是应用jsp进行B/S程序开发过程中经常使用的上传文件组件,支持中文文件名文件
  • Fileupload组件(经常):是Apache commons下面的子项目,用来实现java环境下面的文件上传功能
  • Servlet3.0支持:

     文件上传

     注解开发

    异步请求

  • Struts2框架:底层实现了fileupload,对fileupload进行了封装。
  • SpringMvc框架:底层也实现了文件的上传

1.3        文件上传要素

  • 表单的提交方式必须是Post
  • 表单中需要提供<input type=”file”>这个文件项必须有name属性值
  • 表单的enctype属性必须设置为multipart/form-data

2         文件上传代码实现

2.1        修改jsp页面

  • 提供文件上传项

 

2.2        修改表单的enctype属性:

 

3. 目录分离算法分析:

       

二、SSH中struts2的文件上传;

   1. action 里面的设置:

@Controller
@Scope("prototype")
public class CustomerAction extends ActionSupport implements ModelDriven<Customer>{
    @Autowired
    private CustomerService customerService;
    // 模型驱动使用的对象
    private Customer customer = new Customer();/**
     * 文件上传提供的三个属性,需要添加set方法,这三个属性必须要有属性驱动注入
     */
    private String uploadFileName;//接收文件上传的名称
    private File upload;//要上传的文件,这个名称要跟jsp页面的文件上传组件的name属性值一样
    private String uploadContentType;//文件类型
    
    public void setUploadFileName(String uploadFileName) {
        this.uploadFileName = uploadFileName;
    }
    public void setUpload(File upload) {
        this.upload = upload;
    }
    public void setUploadContentType(String uploadContentType) {
        this.uploadContentType = uploadContentType;
    }
    @Override
    public Customer getModel() {
        return customer;
    }/**
     * 保存客户信息
     * <p>Title: CustomerAction</p>
     * <p>Description: </p>
     * @return
     * @throws IOException 
     */
    public String saveCustomer() throws IOException {
        //上传文件:
        if(upload != null) {
            //设置文件上传路径
            String path = "C:/upload";
            //一个目录下存放的相同文件名:随机文件名
            String uuidFileName = UploadUtils.getUUIDFleName(uploadFileName);
            //一个目录下存放的文件过多:目录分离
            String realPath = UploadUtils.getPathByHash(uuidFileName);
            //创建目录
            String url = path + realPath;
            File file = new File(url);
            if(!file.exists()) {
                file.mkdirs();
            }
            //文件上传
            File dictFile = new File(url + "/" + uuidFileName);
            FileUtils.copyFile(upload, dictFile);
        }
        customerService.saveCustomer(customer);
        return NONE;
    }
}

 2. 编写文件目录工具类

package com.sshcrm.utils;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 文件上传工具类
 * <p>
 * Title: UploadUtils.java
 * </p>
 * <p>
 * Description:
 * </p>
 * <p>
 * Company: WSJT
 * </p>
 * 
 * @author 王亚强
 * @date 2018年7月26日
 *
 */
public class UploadUtils {
    public static String getUUIDFleName(String fileName) {
        // 获取唯一的文件名加上扩展名
        String extions = fileName.substring(fileName.lastIndexOf("."));
        String uuidFileName = IdGenertor.genGUID() + extions;
        return uuidFileName;
    }

    // 目录分离法来获取目录
    public static String getPathByHash(String uuidFileName) {
        // 目录分离
        int code1 = uuidFileName.hashCode();
        int d1 = code1 & 0xf;// 作为一级目录
        int code2 = code1 >>> 4;// 右移4位
        int d2 = code2 & 0xf;// 作为二级目录 0x代表16进制
        return "/" + d1 + "/" + d2;
    }

    // 日期目录分离法
    public static String getPathByDate() {
        // 目录分离
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("/yyyy/MM/dd");
        String timePath = simpleDateFormat.format(date);
        return timePath;
    }
}
package com.sshcrm.utils;

import java.math.BigInteger;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.UUID;
/**
 * 获取GUID和UUID
 * @author Mike
 *
 */
public class IdGenertor {
    private static UUID uuid=null;
    private static final Random RANDOM=new Random();
    //获取UUID
    public static String getUUID() {  
        uuid = UUID.randomUUID();   
        String idstr = uuid.toString().replace("-", "");  
        return idstr.toUpperCase();  
    }  
    //获取GUID
    public static String genGUID(){
        return new BigInteger(165, RANDOM).toString(36).toUpperCase();
    }
    
    public static String genOrdernum(){
        Date now = new Date();
        DateFormat df = new SimpleDateFormat("yyyyMMdd");
        String s1 = df.format(now);// 20141026+纳秒
        return s1+System.nanoTime();
    }
}

3.struts设置文件上传限定:workflow是struts最后一个拦截器,如果其中拦截器没有通过并且没有设置input视图就会跳转到没有视图的页面

4. 配置好在跳转页面回显错误信息

三、SSM框架springMVC文件上传:

1. 需要在Controller方法参数类添加MutipartFile uploadFile;注意uploadFile要与jsp页面的属性名字一样

    @RequestMapping(value="/pic/upload",produces=MediaType.TEXT_PLAIN_VALUE + ";charset=utf-8")
    @ResponseBody
    public String pictureUpload(MultipartFile uploadFile){
        Map<String, Object> result = pictureService.uploadPicture(uploadFile);
        //为了保证功能的兼容性,需要把Result转化为json格式的字符串
        String json = JsonUtils.objectToJson(result);
        return json;
    }

2. pictureService代码:

@Override
    public Map uploadPicture(MultipartFile uploadFile){
        Map<String,Object> resultMap = new HashMap<>();
        try {
            //生成一个新的文件名
            //取原始文件名
            String oldFileName = uploadFile.getOriginalFilename();
            //生成新文件名
        //设置文件上传路径
            String path = "C:/upload";
            //一个目录下存放的相同文件名:随机文件名
            String uuidFileName = UploadUtils.getUUIDFleName(uploadFileName);
            //一个目录下存放的文件过多:目录分离
            String realPath = UploadUtils.getPathByHash(uuidFileName);
            //创建目录
            String url = path + realPath;
            File file = new File(url);
            if(!file.exists()) {
                file.mkdirs();
            }
            //文件上传
            File dictFile = new File(url + "/" + uuidFileName);
            FileUtils.copyFile(upload, dictFile);
       resultMap.put("error", 0); 
       resultMap.put(
"url",url + "/" + uuidFileName);
       return resultMap;
     } catch (IOException e) { 
      resultMap.put(
"error", 1);
      resultMap.put(
"message", "文件上传发送异常");
      return resultMap;
    }
}

 

posted @ 2018-07-26 09:58  四季写爱  阅读(375)  评论(0编辑  收藏  举报