springboot实现上传下载

文件上传

在application.properties 中配置 上传文件限定大小

#上传下载
#最大文件大小。值可以使用后缀“MB”或“KB”。指示兆字节或千字节大小。
spring.servlet.multipart.max-file-size=10MB
# 最大请求大小可以是mb也可以是kb
spring.servlet.multipart.max-request-size=10MB
application.properties配置

接着可以写前台页面 注意上传的form 表单要写属性 enctype="multipart/form-data"

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传文件</title>
</head>
<body>

<h2>上传文件</h2>
  <form action="/file/upload" method="post" enctype="multipart/form-data" >
    <input type="file" name="myfile"/><br/>
    <input  type="submit" value="提交"/>
  </form>
</body>
</html>

编写后台代码 新建FileController 来处理文件的上传下载请求 使用 MultipartFile 来接收文件
并使用MultipartFile的transferTo(File file)方法将前台文件存入服务器


新建controller
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import java.util.UUID;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
// @RestController 是 @responsebody和@controller两个标签的合体
@RestController
//窄化路径
@RequestMapping(value = "/file")
public class FileController {
//传统springmvc上传方式 需要使用spring mvc 的jar
    @RequestMapping("upload")
    @ResponseBody
    public String getfile(@RequestParam("myfile") MultipartFile file){
        System.out.println("file name = "+file.getOriginalFilename());
        // 获取文件名
        String fileName = file.getOriginalFilename();
        // 获取后缀
        String suffixName = fileName.substring(fileName.lastIndexOf("."));
        // 文件上传的路径
        String filePath = "E:\\codeworkspaces\\uploadspace\\20190410\\";
        // fileName处理
        fileName = filePath+ UUID.randomUUID()+fileName;
        // 文件对象
        File dest = new File(fileName);
        // 创建路径
        if(!dest.getParentFile().exists()){
            dest.getParentFile().mkdir();
        }
        try {
            //保存文件
            file.transferTo(dest);
            return "上传成功";
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "上传失败";
    }
}

上传文件


image.png

上传成功


前台页面

服务器端文件系统

如果将上传大小限制为1M 我们上传1.5M文件会提示如下错误


前台接收到后台发来的500状态

上传文件过大异常

文件下载

变写前台页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件下载</title>
</head>
<body>
<h1>文件下载</h1>
<a href="/file/download">Delphine Mantoulet - Java.mp3 音乐下载</a>
</body>
</html>

利用io流将 服务器端文件 通过response 写到客户端对应位置

 @RequestMapping("download")
    public void download(HttpServletResponse response) throws FileNotFoundException {
        File file =new File("E:\\codeworkspaces\\downloadspace\\Delphine Mantoulet - Java.mp3");
        FileInputStream fileInputStream=new FileInputStream(file);
        // 设置被下载而不是被打开
        response.setContentType("application/gorce-download");
        // Content-disposition其实可以控制用户请求所得的内容存为一个文件的时候提供一个默认的文件名,文件直接在浏览器上显示或者在访问时弹出文件下载对话框。
        response.addHeader("Content-disposition","attachment;fileName=Delphine Mantoulet - Java.mp3");
        try {
            OutputStream outputStream = response.getOutputStream();
            byte[] bytes = new byte[1024];
            int len = 0;
            while ((len = fileInputStream.read(bytes))!=-1){
                outputStream.write(bytes,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

利用nio 实现文件下载
前台

<h1>文件下载2</h1>
<a href="/file/niodownload">Delphine Mantoulet - Java.mp3 音乐nio下载</a>
</body>

controller编写

    @RequestMapping("niodownload")
    public void download2(HttpServletResponse response) throws FileNotFoundException {
        File file =new File("E:\\codeworkspaces\\downloadspace\\Delphine Mantoulet - Java.mp3");
        FileInputStream fileInputStream=new FileInputStream(file);
        // 设置被下载而不是被打开
        response.setContentType("application/gorce-download");
        //Content-disposition其实可以控制用户请求所得的内容存为一个文件的时候提供一个默认的文件名,文件直接在浏览器上显示或者在访问时弹出文件下载对话框。
        response.addHeader("Content-disposition","attachment;fileName=Delphine Mantoulet - Java.mp3");
            //NIO 实现
            int bufferSize = 1024*1024*2;
            FileChannel fileChannel = fileInputStream.getChannel();
            // 6x128 KB = 768KB byte buffer

            ByteBuffer buff = ByteBuffer.allocateDirect(1024*1024*4);
            byte[] byteArr = new byte[bufferSize];
            int nRead, nGet;

            try {
                while ((nRead = fileChannel.read(buff)) != -1) {
                    if (nRead == 0) {
                        continue;
                    }
                    buff.position(0);
                    buff.limit(nRead);
                    while (buff.hasRemaining()) {
                        nGet = Math.min(buff.remaining(), bufferSize);
                        // read bytes from disk
                        buff.get(byteArr, 0, nGet);
                        // write bytes to output
                        response.getOutputStream().write(byteArr);
                    }
                    buff.clear();
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                buff.clear();
//                fileChannel.close();
//                fileInputStream.close();
            }

    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容