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;
}
}
SSH,SSM框架文件上传的更多相关文章
- 文件上传—SSM框架文件上传
1.准备上传下载的api组件 <dependency> <groupId>commons-io</groupId> <artifactId>common ...
- ssm框架文件上传
有两种方法 导包和上传配置自己搞: 第一种: 上传单个文件: @RequestMapping("/addfile1") public String addfile(@Request ...
- ssh框架文件上传下载
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 第二百七十三节,Tornado框架-文件上传
Tornado框架-文件上传 第一.普通表单上传文件 self.request.files["fafafa"] 获取上传文件信息,参数["上传文件框的name名称&quo ...
- tp框架-----文件上传
之前也做过文件上传,现在学了tp,用tp怎么做呢? 第一步:做一个Wenjian控制器: <?php namespace Ceshi\Controller; use Think\Controll ...
- 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 ...
- SSM实现文件上传
1.导入上传需要的jar包 commons-fileupload-1.3.3.jar commons-io-2.6.jar 2.创建 index.jsp <%@ page contentType ...
- 文件上传—SSH框架文件上传
1.准备上传的api组件 <dependency> <groupId>commons-io</groupId> <artifactId>commons- ...
- Android采取async框架文件上传
页面效果 须要的权限 <uses-permission android:name="android.permission.INTERNET"/> 网络訪问权限; 布局文 ...
随机推荐
- Ubuntu16.04 JAVA配置!
下面是转发的文章,写得不错,不过有些地方需要注意: 1,以root身份登入,安装和配置JDK,这样JDK是全局的,其他用户也可以使用! 2,下面文章中的JDK版本应该比我们目前能够下载的要旧,我们把下 ...
- [Swift]字符串(String类、NSString类)常用操作
NS是Cocoa类对象类型的前缀,来源于乔布斯建立的另一家公司--NeXTNSString的使用方法,和Swift语言中的String有很多相似之处. 1.字符串的定义String类 var str1 ...
- P5038 [SCOI2012]奇怪的游戏 二分+网络流
$ \color{#0066ff}{ 题目描述 }$ Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 \(N \times M\) 的棋盘上玩,每个格子有一个数.每次\(Blinker\)会 ...
- Linux-Web应用服务性能测试初探
一.服务端与客户端的准备工作 对于服务器最想要的数据就是,每秒支持的并发数,以及相应的内存CPU使用情况. 服务端需要设置最大打开描述符的限制(以支持创建大量的socket),配置socket参数.客 ...
- 使用 WebClient 來存取 GET,POST,PUT,DELETE,PATCH 網路資源
WebClient 基本資訊 提供通用方法使用 WebRequest 類別傳送及接收 URI (支援 http:, https:, ftp:,和 file: ) 的資源 Namespace:Syste ...
- node.js调试方法
第一种方式:node内置的调试器 在程序中添加debugger,然后在启动node程序时,使用debug模式启动 1.node debug my_event.js 2.使用node文档中各种命令,进行 ...
- python全栈开发_day11_作用域,函数嵌套和闭包
一:作用域 1)什么是作用域 作用域是规定一个变量可以作用的范围,运行和销毁的范围 2)作用域的分类 1.内置作用域built_in:随着解释器的运行而产生,解释器运行的终止而销毁. 2.全局作用域g ...
- vue,下级页面刷新导致路由跳转带过来的数据消失的解决方法
if(typeof(this.$route.query.result)=='string'){ //刷新时走这 }else{ //正常路由跳转过来后就把数据塞到 localStorage let ob ...
- 3. Javascript学习笔记——变量、内存、作用域
3. 变量.内存.作用域 3.1 基本类型和引用类型的值 ECMAScript 变量可能包含两种不同数据类型的值:基本类型值[Undefined.Null.Boolean.Number 和 Strin ...
- HDU - 5306 剪枝的线段树
题意:给定\(a[1...n]\),\(m\)次操作,0表示使\([L,R]\)中的值\(a[i]=min(a[i],x)\),其余的1是查最值2是查区间和 本题是吉利爷的2016论文题,1 2套路不 ...