ssm框架中基于springMVC进行的文件上传.

在做ssm的文件上传的时候, 前面起码是已经整合好了, 最少新建一个项目, 写一个Controller,项目可以跑起来, 也能被访问成功. 如果还没有整合成功.

请看这里: http://blog.csdn.net/liu72849/article/details/78003992


可能需要用到的几个依赖,基于maven的添加到pom.xml文件:

<dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.10</version>
        </dependency>



配置完成之后, 我们还要针对文件上传在配置文件中添加新的标签.

在spring-mvc.xml(基于上面网站中的配置文件)中添加:

<!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->
    <bean id="mappingJacksonHttpMessageConverter"
          class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>text/html;charset=utf-8</value>
            </list>
        </property>
    </bean>

    <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
    <bean
            class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="mappingJacksonHttpMessageConverter"/><!-- json转换器 -->
            </list>
        </property>
    </bean>

    <!-- 支持上传文件 -->
    <bean id="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 100M -->
        <property name="maxUploadSize" value="104857600"></property>
        <property name="defaultEncoding" value="utf-8"></property>
    </bean>



然后我这里是写的一个根据上传的文件名称 取唯一值 以及根据上传文件名称 生成两级目录的工具类.

package com.ssm.utils;

//jdk中的UUID类.
import java.util.UUID;

//定义一个解决上传时候, 产生因用户上传文件名称相同导致上传过来的文件被覆盖这个问题.
public class StringUuid {
	@SuppressWarnings("unused")
//	获取一个唯一值.
	public static String getUuidFilename(String filename) {

		// 首先, 将传进来的文件名, 进行截取, 只保留 .xxx的后缀名.
		// 在这个文件名, 截取 " . "和它后面的字符串
		String substring = filename.substring(filename.lastIndexOf("."));

		// 接着使用 jdk的API中带有的 UUID.randomUUID().toString()方法产生一个随机且不重复的字符串.
		String replace = UUID.randomUUID().toString().replace("-", "");

		// 将这个随机产生的字符串 作为文件的前缀名, 再加上后缀名称就可以避免用户上传同名文件产生 文件被覆盖这个问题.
		String filenames = replace + substring;
		return filenames;

	}

//	通过文件名称创建二级目录.
	public static String getRealPath(String uUidfilename){
		//首先, 将唯一的文件名变成一个 hash值.
		int hashCode1 = uUidfilename.hashCode();
		
		//然后 将这个hash值和 0xf(也就是二进制的 1111)做 位与运算.
		int hashCode2 = hashCode1 & 0xf;
		
		//将做完位与运算的结果右移4位.
		int hashCode3 = hashCode2>>>4;
		//将右移完了的结果 再次和 1111这个二进制数进行 位与运算.
		
		int hashCode4 = hashCode3 & 0xf;
		//之后, 将 第一次的位与运算得到的数字作为 一级目录, 将 第二次的位与运算得到的数字作为二级目录.
		return "/"+hashCode2+"/"+hashCode4;
	}
}


接着在Controller(handler)中,写一个接收上传文件的方法.

package com.ssm.controller;

import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;


import com.ssm.dto.Uploadfile;
import com.ssm.service.UploadService;
import com.ssm.utils.StringUuid;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

@Controller
@RequestMapping("/TUser")
public class UserController {
//    注入文件上传的业务层.
    @Resource
    private UploadService uploadService;

 @RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
    @ResponseBody
    public String upload(MultipartFile file, HttpServletRequest request,Model model) throws IOException {
//        获取我们准备好的用于存储上传文件的绝对路径.
        String paths = request.getSession().getServletContext().getRealPath("upload");

//        获取上传过来的原始文件名.
        String fileName = file.getOriginalFilename();
        System.out.println(fileName);

//        IE浏览器在上传的时候会将盘符路径也传递过来.截取文件名.
//        lastIndexOf()方法, 指定从 该字符串中的 最后一个  "\"号后开始截取.
        String lastfile = fileName.substring(fileName.lastIndexOf("\\") + 1);

//        将截取后的文件名使用UUID,生成一个唯一的文件名称,
        String filenameuuid = StringUuid.getUuidFilename(lastfile);

//        将唯一的文件名, 传入这个方法,得到目录分离
//        这是根据传递过来的文件名称在upload这个主存储文件夹下生成其他字文件夹.
        String realPath = StringUuid.getRealPath(filenameuuid);

//        将主存储目录名称和子文件夹名称连接在一起.
        String path = paths + realPath;

//        生成文件夹以及生成准备接收内容的文件.
        File dir = new File(path,filenameuuid);
        System.out.println(dir);

//        如果该文件夹不存在则创建.
        if (!dir.exists()) {
            dir.mkdirs();
        }

//        MultipartFile自带的解析方法.底层将上传的文件以流对流的方式接收内容.
        file.transferTo(dir);

//        获取这个文件存储的虚拟全路径.
        String contextPath = request.getContextPath();//获取项目名称.
//        获取域名+项目名称
        String basePath = request.getScheme()+"://"+request.getServerName()+":"+ request.getServerPort()+contextPath+"/";
        System.out.println(basePath);
//        获取上传文件的虚拟路径全名称.
        String relatedAddress = basePath+"upload"+realPath+"/"+filenameuuid;

//        将这个虚拟路径存储到数据库中(对应的实体类中)。
        Uploadfile uploadfile = new Uploadfile();
        uploadfile.setPath(relatedAddress);

//        将对象存入数据库中。这一步实际上就是向数据库表中存一个实现定义好了的pojo类.
//        能做到文件上传这里的话, 自己写一个保存pojo实体类内容到对应表中应该不会有问题.略过步骤
        uploadService.insertUploadfile(uploadfile);

//        将虚拟路径存储到request域中。 这里使用springMVC的model进行存储并返回。
        System.out.println(relatedAddress);

//        这一步就是练着玩的.实际底层就是向一个request域对象存值.
//        model.addAttribute("name", Object);

//        这里的返回值根据实际要求返回, 可以返回要跳转的页面, 也可以返回一串字符串到要html页面, 在页面根据这个接收到的返回值进行其他步骤.
        return "ok!";
    }
}

具体的业务层和DAO层自己写就好.

html就不写了.网上一大堆的资源.


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值