一、了解文件上传

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. 为啥我的Andrid百度SDK不能正常运行?

    首先,百度SDK运行时候需要加载API Key,这个API Key是通过百度账号在百度里面申请到的,但是很可能大家没有注意到百度这个API Key申请的过程,其中很重要的一个步骤没有做好,而导致不能正 ...

  2. 深入了解java虚拟机(JVM) 第二章 内存区域---栈空间

    一.栈的含义 用于描述方法执行的动态内存模型,简单来说就是代码中的方法模块.主要用于局部变量表.栈的大小在编译器中就已经分配了空间,在进入一个方法时,这个方法需要栈帧分配多少内存是固定的,运行期间是不 ...

  3. “全栈2019”Java第六十六章:抽象类与接口详细对比

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  4. RDLC报表的相关技巧三(数量/金额的逐页累加)

    数量/金额的逐页累加,不是当页小计. 核心步骤: 1.在Group1大组中加入小组Group2,2.Group2的组尾加入一个计算框 : =RunningValue(Fields!BaseAmount ...

  5. 小记 Linux 之 Vim

    小记 Linux 之 Vim 使用vim用来进行文本流查询,是非常重要的部分. 技巧一:使用 '#' 系统将列出文档相同字符,在代码时很重要. 技巧二:使用 ']I' 具体操作是先使用 ? 或 \ 进 ...

  6. now() 的用法

    在平时对于数据库操作中,有时候会使用到时间,比如-数据的创建时间/更新时间之类问题,可能是需要查询出时间的结果,也存在大量的需要搜索某个时间点或时间段的操作: MySQL中取本地时间 now() 取本 ...

  7. 一分钟了解 TCP/IP 模型

    原文讲的不是特别细,为了便于理解,我颠倒了顺序. 写在开始 我们需要知道协议到底是什么. 在网络上,一个协议对应于管理系统之间如何相互通信的规则. 然后我们需要知道什么是协议族. 一个协议族是一系列协 ...

  8. 启动与销毁Activity

    启动与销毁Activity 编写:kesenhoo - 原文:http://developer.android.com/training/basics/activity-lifecycle/start ...

  9. 前端获取指定cookie

    前端获取指定cookie的值 function getCookie(cookiename){ var name = cookiename + "="; var cs = docum ...

  10. nodejs的process.on('message')转promise

    // main.js const cp = require('child_process'); const child = cp.fork('./child.js'); const callbackP ...