springMVC 文件上传和下载

 文件的下载

获得服务器文件的根路径

String realPath=servletContext.getRealPath("/");

realPath:

E:\SpringMVC\Springmvc-project1\Springmvc-demo2\target\Springmvc-demo2-1.0-SNAPSHOT\

获得根路径之后在跟路径后面加上我想创建的层次名和文件名,可以直接这样写:

String realPath=servletContext.getRealPath("/static/img/1.jpg");

realPath:

E:\SpringMVC\Springmvc-project1\Springmvc-demo2\target\Springmvc-demo2-1.0-SNAPSHOT\static\img\1.jpg

@Controller
public class FileUpAndDown {
    @RequestMapping("/download")
    public ResponseEntity downloadfile(HttpSession session)throws IOException
    {
//        获取servletcontext对象(就是application对象,通过它可以读取配置文件,javaweb基础)
        ServletContext servletContext=session.getServletContext();
//        获得要下载文件在服务器中存放的真实地址
        String realPath=servletContext.getRealPath("/static/img/1.jpg");
//        获得文件地址的输入字节流
        InputStream is=new FileInputStream(realPath);
//        获得输入文件的字节流的长度  is.available()代表字节流的长度
        byte[] bytes=new byte[is.available()];
//      将输入流中的数据放到字节数组中
//      bytes就是下载文件的字节流,就是响应体
        is.read(bytes);
//       创建HttpHeaders对象设置响应头信息
        MultiValueMap headers=new HttpHeaders();
//        在multivaluemap对象中,设置下载方式(附件形式)            下载的文件名
        headers.add("Content-Disposition","attachment;filename=1.jpg");
//        设置响应状态码
        HttpStatus status=HttpStatus.OK;
//         创建ResponseEntity对象     bytes 文件的字节流也就是响应体,
//         header文件的下载方式,文件临时名称 status 下载状态码,ok表示成功200
        ResponseEntity responseEntity=new ResponseEntity<>(bytes,headers,status);
//        关闭输入流
        is.close();
        return  responseEntity;
    }

文件的上传

1.不能使用get请求,只能使用post请求

2.form表单中必须有  属性enctype="multipart/form-data"  才是以二进制方式传参数
SpringMVC中将上传的文件封装到MultipartFile对象中,通过此对象可以获取文件相关信息
上传步骤:
a>添加依赖:


commons-fileupload
commons-fileupload
1.3.1

b>在SpringMVC的配置文件中添加配置:


c>控制器方法:

先把文件要存放在服务器的地址的绝对路径找出来,之后直接 photo.transferTo(file);即可

photo 是input标签 的name 

@RequestMapping("/fileupload")
    @ResponseBody
    public String testfileupload(MultipartFile photo, HttpSession session) {

//        因为如果要上传的文件重名了,则会替换掉原来的文件,所以所有上传到服务器的文件都要重命名一次,
//        新名字随机生成,且后缀是要上传文件的后缀
        String filename = photo.getOriginalFilename();//获得要上传文件的文件名
        String houzhui = filename.substring(filename.lastIndexOf("."));//获得要上传文件的后缀
        String uuid = UUID.randomUUID().toString();
        String newname=uuid+houzhui;
        System.out.println(newname);

//        获得要接收上传的文件的文件夹在服务器的绝对路径  
// ServletContext就是applicationcontext javaweb基础 jsp九大内置对象之一,
//  可以用于读取配置文件,servlet之间共享数据等
        ServletContext context = session.getServletContext();
//        FileUpLoad 会在服务器找这个文件夹,找不到就返回空,找到了就返回该文件夹在服务器的绝对路径
        String filepath=context.getRealPath("bootstrap/FileUpLoad");
        File file=new File(filepath);
//        如果找不到,就在服务器文件夹下创建该文件夹
        if (!file.exists()) {
            file.mkdir();
        }
        String finalpath = file + File.separator + newname;
        System.out.println(filepath);
        System.out.println(finalpath);

//        上传文件
        try {
            photo.transferTo(new File(finalpath));//核心语句,将photo上传到file文件中
        } catch (IOException e) {
            e.printStackTrace();
        }

    return "index" ;
    }

输出 

 target文件夹才是服务器的文件夹,所以上传的文件会存放进这个目录。

这个SpringMvc-1.0-SNASHOT  可能是服务器的跟路径,因为如果没有FileUpLoad文件夹,

会在SpringMvc-1.0-SNASHOT 下根据

context.getRealPath  获得的路径,创建新的FileUpload

springMVC 文件上传和下载_第1张图片

你可能感兴趣的:(spring-mvc,java)