一、了解文件上传

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;
    }
}

SSH,SSM框架文件上传的更多相关文章

  1. 文件上传—SSM框架文件上传

    1.准备上传下载的api组件 <dependency> <groupId>commons-io</groupId> <artifactId>common ...

  2. ssm框架文件上传

    有两种方法 导包和上传配置自己搞: 第一种: 上传单个文件: @RequestMapping("/addfile1") public String addfile(@Request ...

  3. ssh框架文件上传下载

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 第二百七十三节,Tornado框架-文件上传

    Tornado框架-文件上传 第一.普通表单上传文件 self.request.files["fafafa"] 获取上传文件信息,参数["上传文件框的name名称&quo ...

  5. tp框架-----文件上传

    之前也做过文件上传,现在学了tp,用tp怎么做呢? 第一步:做一个Wenjian控制器: <?php namespace Ceshi\Controller; use Think\Controll ...

  6. tp 框架 -文件上传

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 <?ph ...

  7. SSM实现文件上传

    1.导入上传需要的jar包 commons-fileupload-1.3.3.jar commons-io-2.6.jar 2.创建 index.jsp <%@ page contentType ...

  8. 文件上传—SSH框架文件上传

    1.准备上传的api组件 <dependency> <groupId>commons-io</groupId> <artifactId>commons- ...

  9. Android采取async框架文件上传

    页面效果 须要的权限 <uses-permission android:name="android.permission.INTERNET"/> 网络訪问权限; 布局文 ...

随机推荐

  1. Binder学习笔记(一)

    网上看了很多关于binder的文章,但我还是想把自己的心路历程记录下来,有些是跟着别人的脚步领略险峻风景,有些则是自己只身探入代码深处打捞出的收获.我不确定是否全部融会贯通,更担心一两个月后会完全不记 ...

  2. while循环/格式化输出/ 逻辑运算/ 编码 /单位转换

    一.while 循环 1. 循环 while 条件: 代码块(循环体) else: 当上面的条件为假. 才会执行 执行顺序: 判断条件是否为真. 如果真. 执行循环体. 然后再次判断条件....直到循 ...

  3. String,数组,list集合长度的使用

    public class Use{ public static void main(String[] args){ int[] arr=new int[]{19,10,20,30,23,13}; // ...

  4. 【手记】如果Idx/Sub字幕导不进MKVToolNix,看看是否这个原因

    用记事本之类的文本编辑器打开idx文件,看看时间轴部分是不是存在不规范的条目,比如: timestamp: :::, filepos: 注意,上述条目中,filepos:后面缺了一个空格,就这么一处问 ...

  5. 封装log4j支持记录到testng

    一.初始方案 自动化中需要把日志通过testng的Reporter.log来记录日志在报告中展示.开始是新增了一个日志类: ReporterLog.class import org.slf4j.Log ...

  6. CDQZ Day4

    NOIP 模拟题By liu_runda题目名称 数 论 题源程序文件名 number.cpp theory.cpp problem.cpp输入文件名 number.in theory.in prob ...

  7. UVALive - 6436、HYSBZ - 2435 (dfs)

    这两道题都是用简单dfs解的,主要是熟悉回溯过程就能做,据说用bfs也能做 道路修建(HYSBZ - 2435) 在 W 星球上有n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道 ...

  8. genkins的报错排查

    [ERROR] /root/.jenkins/workspace/car/src/main/java/com/zhengxin/tool/code/Code.java:[20,64] diamond ...

  9. PHP的curl实现get,post 和 cookie (转)

    类似于dreamhost这类主机服务商,是显示fopen的使用 的.使用php的curl可以实现支持FTP.FTPS.HTTP HTPPS SCP SFTP TFTP TELNET DICT FILE ...

  10. 2017 FVDI2 ABRITES Commander with 18 Softwares FULL Version + FLY OBD Terminator + J2534 DrewTech Softwares

    Highlights of FVDI2 Abrites Commander Full Version: 1.Free update online. 2.This is full version FVD ...