• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

文件上传本地服务器

武飞扬头像
苏柠沅
帮助1

文件上传的本质就是将文件通过IO流复制到服务器。文件上传是先上传到临时目录,然后再从临时目录复制到磁盘,目的是防止用户在上传途中网路中断、刷新页面导致文件上传失败,从而磁盘中产生大量垃圾文件和正常文件混在一起,所以只有文件上传成功后,才会从临时文件复制到磁盘,之后系统会自动删除临时文件。

前端HTML

  1.  
    <!doctype html>
  2.  
    <html lang="en">
  3.  
    <head>
  4.  
    <meta charset="utf-8">
  5.  
    <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
  6.  
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7.  
    <title>文件上传</title>
  8.  
    </head>
  9.  
    <body>
  10.  
    <h1>文件上传</h1>
  11.  
    <form action="/upload/file" id="touploadform" enctype="multipart/form-data" method="post">
  12.  
     
  13.  
    <input name="dir" value="bbs">
  14.  
    <input id="file" name="file" onchange="toupload()" type="file" accept="image/*"/>
  15.  
    <script>
  16.  
    function toupload(){
  17.  
    document.getElementById("touploadform").submit();
  18.  
    }
  19.  
     
  20.  
    file.addEventListener('change', async e => {
  21.  
    const file = e.target.files[0]
  22.  
    const flag = await isImage(file)
  23.  
    if (flag) {
  24.  
    alert('上传格式通过!')
  25.  
    } else {
  26.  
    alert('请上传正确的格式!')
  27.  
    }
  28.  
    })
  29.  
    // 判断是否为图片
  30.  
    async function isImage(file) {
  31.  
    return (await isGif(file)) || (await isPng(file)) || (await isJpg(file))
  32.  
    }
  33.  
    // 判断是否为 jpg 格式
  34.  
    async function isJpg(file) {
  35.  
    const res = await blobToString(file.slice(0, 3))
  36.  
    return res === 'FF D8 FF'
  37.  
    }
  38.  
    // 判断是否为 png 格式
  39.  
    async function isPng(file) {
  40.  
    const res = await blobToString(file.slice(0, 4))
  41.  
    return res === '89 50 4E 47'
  42.  
    }
  43.  
    // 判断是否为 gif 格式
  44.  
    async function isGif(file) {
  45.  
    const res = await blobToString(file.slice(0, 4))
  46.  
    return res === '47 49 46 38'
  47.  
    }
  48.  
    // 将文件转为十六进制字符串
  49.  
    async function blobToString(blob) {
  50.  
    return new Promise(resolve => {
  51.  
    const reader = new FileReader()
  52.  
    reader.onload = function () {
  53.  
    const res = reader.result
  54.  
    .split('') // 将读取结果分割为数组
  55.  
    .map(v => v.charCodeAt()) // 转为 Unicode 编码
  56.  
    .map(v => v.toString(16).toUpperCase()) // 转为十六进制,再转大写
  57.  
    .map(v => v.padStart(2, '0')) // 个位数补0
  58.  
    .join(' ') // 转为字符串
  59.  
    resolve(res)
  60.  
    }
  61.  
    reader.readAsBinaryString(blob) // 将文件读取为二进制字符串
  62.  
    })
  63.  
    }
  64.  
    </script>
  65.  
    <!-- <input type="submit" value="文件上传">-->
  66.  
    </form>
  67.  
    </body>
  68.  
    </html>
学新通

 controller层

  1.  
    package com.kuangstuday.controller;
  2.  
     
  3.  
    import com.kuangstuday.service.UploadService;
  4.  
    import org.springframework.beans.factory.annotation.Autowired;
  5.  
    import org.springframework.stereotype.Controller;
  6.  
    import org.springframework.web.bind.annotation.PostMapping;
  7.  
    import org.springframework.web.bind.annotation.RequestParam;
  8.  
    import org.springframework.web.bind.annotation.ResponseBody;
  9.  
    import org.springframework.web.multipart.MultipartFile;
  10.  
     
  11.  
    import javax.servlet.http.HttpServletRequest;
  12.  
    import java.util.Map;
  13.  
     
  14.  
    @Controller
  15.  
    public class UploadController {
  16.  
     
  17.  
     
  18.  
    @Autowired
  19.  
    private UploadService uploadService;
  20.  
     
  21.  
    @PostMapping("/upload/file")
  22.  
    @ResponseBody
  23.  
    public Map<String,Object> upload(@RequestParam("file")MultipartFile multipartFile, HttpServletRequest request){
  24.  
    if (multipartFile.isEmpty()){
  25.  
    return null;
  26.  
    }
  27.  
     
  28.  
    //1:获取用户指定的文件夹。问这个文件夹为什么要从页面上传递过来呐?
  29.  
    //原因是:做隔离,不同业务,不同的文件夹放在不同的目录中
  30.  
    String dir = request.getParameter("dir");
  31.  
    return uploadService.uploadImg(multipartFile,dir);
  32.  
    }
  33.  
    }
学新通

service层

  1.  
    package com.kuangstuday.service;
  2.  
     
  3.  
    import org.springframework.beans.factory.annotation.Value;
  4.  
    import org.springframework.stereotype.Service;
  5.  
    import org.springframework.web.multipart.MultipartFile;
  6.  
     
  7.  
    import java.io.File;
  8.  
    import java.io.IOException;
  9.  
    import java.text.SimpleDateFormat;
  10.  
    import java.util.Date;
  11.  
    import java.util.HashMap;
  12.  
    import java.util.Map;
  13.  
    import java.util.UUID;
  14.  
     
  15.  
    @Service
  16.  
    public class UploadService {
  17.  
    /**
  18.  
    * multipartFile 这个对象是springmvc提供的文件上传接受的类
  19.  
    * 它的底层自动会去和HttpServletRequest request 中的request.getInputStream()融合
  20.  
    * 从而达到文件上传的效果,也就是告诉你一个道理:
  21.  
    * 文件上传的原理是:request.getInputStream()
  22.  
    * @param multipartFile
  23.  
    * @param dir
  24.  
    * @return
  25.  
    */
  26.  
    //从yml文件读取配置
  27.  
    @Value("${file.uploadFolder}")
  28.  
    private String uploadFolder;
  29.  
     
  30.  
    @Value("${file.staticPath}")
  31.  
    private String staticPath;
  32.  
    public Map<String,Object> uploadImg(MultipartFile multipartFile, String dir){
  33.  
    try {
  34.  
    String realfilename = multipartFile.getOriginalFilename();//上传的文件:aaa.jpg
  35.  
    //2.截取文件名的后缀
  36.  
    String imgSuffix = realfilename.substring(realfilename.lastIndexOf("."));//拿到: jpg
  37.  
    //3.生成的唯一的文件名:能不能用中文? 不能,因为统一用英文名
  38.  
    String newFileName = UUID.randomUUID().toString() imgSuffix;//将aaa.jpg改写成:SD22424241-323432ms.jpg
  39.  
    //4.日期目录
  40.  
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
  41.  
    String datePath = dateFormat.format(new Date());//日期目录:2022/11/08
  42.  
    //5.指定文件上传的目录
  43.  
    String servrepath= uploadFolder;
  44.  
    File targetFile = new File("E://tmp/" dir,datePath);//生成一个最终目录:E://temp/bbs/2021/10/37
  45.  
    //如果文件夹不存在,则自动创建
  46.  
    if (!targetFile.exists())targetFile.mkdirs();//如果目录不存在递归创建:E://temp/bbs/2021/10/37
  47.  
    //6.指定文件上传以后的目录
  48.  
    //文件上传到服务器最终为:E://temp/bbs/2021/10/37/SD22424241-323432ms.jpg
  49.  
    File targetFileName = new File(targetFile,newFileName);
  50.  
    //7.文件上传到指定目录
  51.  
    multipartFile.transferTo(targetFileName);//将用户选择的aaa.jpg,上传到服务器E://temp/bbs/2021/10/37/SD22424241-323432ms.jpg
  52.  
     
  53.  
    Map<String,Object> map = new HashMap<>();
  54.  
    map.put("url",staticPath "/upimges/" dir "/" datePath "/" newFileName);
  55.  
    map.put("size",multipartFile.getSize());
  56.  
    map.put("ext",imgSuffix);
  57.  
    map.put("filename",realfilename);
  58.  
    map.put("rpath",dir "/" datePath "/" newFileName);
  59.  
    return map;
  60.  
    } catch (IOException e) {
  61.  
    e.printStackTrace();
  62.  
    return null;
  63.  
    }
  64.  
    }
  65.  
    }
学新通

application.yml文件

  1.  
    server:
  2.  
    port: 8777
  3.  
     
  4.  
     
  5.  
    spring:
  6.  
    freemarker:
  7.  
    suffix: .html
  8.  
    cache: false
  9.  
    servlet:
  10.  
    multipart:
  11.  
    enabled: true
  12.  
    # 单个文件大小 默认1MB
  13.  
    max-file-size: 1MB
  14.  
    # 设置总上传的文件大小
  15.  
    max-request-size: 10MB
  16.  
    # 当文件达到多少时进行磁盘写入
  17.  
    file-size-threshold: 20MB
  18.  
    # 设置临时目录
  19.  
    location: E://data//temp
学新通

config层

  1.  
    @Configuration
  2.  
    public class WebMvcConfiguration implements WebMvcConfigurer {
  3.  
    /**方法一:这个就是springboot中springMvc让程序开发者去配置文件上传的额外的静态资源服务的配置
  4.  
    @Override
  5.  
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
  6.  
    registry.addResourceHandler("/uploadimg/**").addResourceLocations("file:E://tmp//");
  7.  
    }
  8.  
    *registry.addResourceHandler("访问的路径").addResourceLocations("上传资源的路径");
  9.  
    *这个时候你把aaa.png文件上传到了E://tmp下,那么,你可以通过:http://localhost:8777/uploadimg/aaa.png访问到图片
  10.  
    */
  11.  
     
  12.  
    @Value("${file.staticPatternPath}")
  13.  
    private String staticPatternPath;
  14.  
    @Value("${file.uploadFolder}")
  15.  
    private String uploadFolder;
  16.  
    /**
  17.  
    * 方法二
  18.  
    * @param registry
  19.  
    */
  20.  
    @Override
  21.  
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
  22.  
    registry.addResourceHandler(staticPatternPath).addResourceLocations("file:" uploadFolder);
  23.  
    }
  24.  
    }
学新通

application-dev.yml配置

  1.  
    # 本级配置
  2.  
    file:
  3.  
    staticPatternPath: /upimges/**
  4.  
    uploadFolder: E:/tmp/

application-prod.yml配置

  1.  
    #服务器配置
  2.  
    file:
  3.  
    staticPatternPath: /upimges/**
  4.  
    uploadFolder: /www/upload

application.yml配置激活dev

  1.  
    server:
  2.  
    port: 8777
  3.  
     
  4.  
     
  5.  
    spring:
  6.  
    freemarker:
  7.  
    suffix: .html
  8.  
    cache: false
  9.  
    profiles:
  10.  
    active: dev
  11.  
    servlet:
  12.  
    multipart:
  13.  
    enabled: true
  14.  
    # 单个文件大小 默认1MB
  15.  
    max-file-size: 1MB
  16.  
    # 设置总上传的文件大小
  17.  
    max-request-size: 10MB
  18.  
    # 当文件达到多少时进行磁盘写入
  19.  
    file-size-threshold: 20MB
  20.  
    # 设置临时目录
  21.  
    location: E://data//temp
学新通

在浏览器访问http://localhost:8777/upimges/bbs/2022/11/09/2454a5bf-29e2-42b7-a7d6-8b37b0903668.png

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfbihk
系列文章
更多 icon
同类精品
更多 icon
继续加载