当前位置: 首页 > news >正文

如何实现文件上传 - JavaWeb

直接上代码 ( idea 开发,SpringBoot 框架 ):

首先是Controller的写法:

package com.xxx.Controller;

import com.xxx.Tools.ImgTool;
import com.xxx.bean.Msg;
import org.apache.tomcat.util.http.fileupload.FileUploadBase;
import org.apache.tomcat.util.http.fileupload.FileUploadBase.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping(value = "/img")
public class ImgUploadController {

    @PostMapping(value = "/upload")
    public Msg uploadImg(@RequestParam(value = "img") MultipartFile img, HttpServletRequest request) throws IOException, FileSizeLimitExceededException {
        if (img == null){
            return Msg.fail().add("describe", "参数不能为空");
        } else {
            try {
                Map<String , Object> map = new HashMap<>();
                map = ImgTool.upload(img, request);
                if (map.get("resultStr").equals("300")){
                    return Msg.fail().add("describe", "文件格式不支持");
                } else {
                    return Msg.success().add("imgurl", map.get("resultStr"));
                }
            } catch (Exception e){
                return Msg.fail().add("describe", e);
            }
        }
    }
}

upload()函数所在的类,包含一些其他的tool方法 :

package com.xxx.Tools;

import com.xxx.bean.Picture;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

public class ImgTool {

    /**
     * 上传图片,并返回图片路径
     */
    public static Map<String, Object> upload(MultipartFile file, HttpServletRequest request) throws IOException {
        Map<String, Object> map = new HashMap<>();

        //过滤合法的文件类型
        String fileName = file.getOriginalFilename();
        String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
        String allowSuffixs = "gif,jpg,jpeg,bmp,png,ico";
        if (allowSuffixs.indexOf(suffix) == -1){
            //300代表文件格式不支持
            map.put("resultStr", "300");
            System.out.println("文件格式不支持");
            return map;
        }

        //获取真实路径
        String localPath = request.getServletContext().getRealPath("/");

        //创建新目录
        String uri = File.separator + getNowDateStr(File.separator);
        File dir = new File(localPath + "/static/ProjectImgs/" + uri);
        if (!dir.exists()){
            dir.mkdirs();
        }

        //创建新文件
        String newFileName = getUniqueFileName();
        File f = new File(dir.getPath() + File.separator + newFileName + "." + suffix);

        //将输入流中的数据复制到新文件
        org.apache.commons.io.FileUtils.copyInputStreamToFile(file.getInputStream(), f);

        //创建picture对象
        Picture pic = new Picture();
        pic.setLocalPath(f.getAbsolutePath());
        pic.setName(f.getName());
        //将路径中的\\替换成/,符合浏览器的分级规则
        pic.setUrl(localPath.replace("\\", "/")
                + "static/ProjectImgs"
                + uri.replace("\\", "/") + "/" + newFileName + "." + suffix);

        //插入到数据库
        //...

        map.put("resultStr", pic.getUrl());

        return map;
    }

    /**
     * 获取当前日期字符串
     * @param separator
     * @return
     */
    public static String getNowDateStr(String separator){
        Calendar now = Calendar.getInstance();
        int year = now.get(Calendar.YEAR);
        //month 记得加一(因为默认从0开始计数)
        int month = now.get(Calendar.MONTH)+1;
        int day = now.get(Calendar.DATE);

        return year + separator + month + separator + day;
    }

    //生成唯一的文件名
    public static String getUniqueFileName(){
        String str = UUID.randomUUID().toString();
        return str.replace("-", "");
    }
}

Picture类:

package com.xxx.bean;

import java.util.Date;

public class Picture {

    private String localPath;
    private String name;
    private String url;
    private Date addTime;

    public Picture() {
    }

    public Picture(String localPath, String name, String url, Date addTime) {
        this.localPath = localPath;
        this.name = name;
        this.url = url;
        this.addTime = addTime;
    }

    public String getLocalPath() {
        return localPath;
    }

    public void setLocalPath(String localPath) {
        this.localPath = localPath;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public Date getAddTime() {
        return addTime;
    }

    public void setAddTime(Date addTime) {
        this.addTime = addTime;
    }
}

在通常的Web开发中,上面的通用写法只要稍加改动边可以适应自己的项目需求,比如在SSM框架中需要在dispatchServlet.xml中设置上传文件的各种限制;

SpringBoot中可以在.yml文件中配置文件路径,在项目起始的Application类中配置文件大小属性。

下面是SpringBoot中配置文件大小的参考写法,写在类ShouguoApplication,即入口程序段中:

package com.xxx;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import javax.servlet.MultipartConfigElement;

@SpringBootApplication
public class ShouguoApplication {

    public static void main(String[] args) {
        SpringApplication.run(ShouguoApplication.class, args);
    }

    /**
     * 文件上传配置
     */
    @Bean
    public MultipartConfigElement multipartConfigElement(){
        MultipartConfigFactory factory = new MultipartConfigFactory();
        //maxSize
        factory.setMaxFileSize("10240KB");
        //设置总上传数据总大小
        factory.setMaxRequestSize("102400KB");
        return factory.createMultipartConfig();
    }
}

 

 

转载于:https://www.cnblogs.com/zishu/p/8982248.html

相关文章:

  • Shiro之身份认证、与spring集成(入门级)
  • ES6语法详解(一)
  • 设计模式之六大原则
  • -HTMLCSS- 之京东首页学习
  • 导读
  • SSL/TLS协议运行机制的概述
  • dva/dynamic
  • Java基础-线程操作共享数据的安全问题
  • 三、Mac平台下集成 FFmpeg 框架
  • (汇总)os模块以及shutil模块对文件的操作
  • windows2008搭建FTP限制上传文件大小
  • 「转载」用户使用分享_开源PaaS Rainbond
  • 京东架构师-----解析Hystrix线程隔离技术
  • spring整合kaptcha验证码
  • 线程池参数的意义
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 【前端学习】-粗谈选择器
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • extjs4学习之配置
  • IDEA常用插件整理
  • iOS编译提示和导航提示
  • JavaScript设计模式之工厂模式
  • js作用域和this的理解
  • Linux快速复制或删除大量小文件
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • socket.io+express实现聊天室的思考(三)
  • Vue2 SSR 的优化之旅
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 老板让我十分钟上手nx-admin
  • 你真的知道 == 和 equals 的区别吗?
  • 如何解决微信端直接跳WAP端
  • 使用common-codec进行md5加密
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 智能合约Solidity教程-事件和日志(一)
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • #pragma 指令
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (ros//EnvironmentVariables)ros环境变量
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (一)kafka实战——kafka源码编译启动
  • (转)h264中avc和flv数据的解析
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .libPaths()设置包加载目录
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET HttpWebRequest、WebClient、HttpClient
  • .Net mvc总结
  • ??javascript里的变量问题
  • @DataRedisTest测试redis从未如此丝滑
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证
  • [2023年]-hadoop面试真题(一)
  • [C#]winform部署yolov9的onnx模型
  • [C]整形提升(转载)