博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何实现文件上传 - JavaWeb
阅读量:5928 次
发布时间:2019-06-19

本文共 5969 字,大约阅读时间需要 19 分钟。

直接上代码 ( 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
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
upload(MultipartFile file, HttpServletRequest request) throws IOException { Map
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;@SpringBootApplicationpublic 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

你可能感兴趣的文章
fedora17的gnome3桌面美化
查看>>
docker supervisor管理进程
查看>>
Java类的继承总结
查看>>
我的友情链接
查看>>
第10章-管理Hadoop集群-hadoop 安全模式相关知识点
查看>>
MongoDB常用操作
查看>>
BBSXP论坛手工得到用户md5密码的方法
查看>>
Apache 虚拟主机 VirtualHost 配置
查看>>
nat+端口转发,使得宿主机secureCRT可以访问vbox里linux虚拟机
查看>>
网管小王的工具包
查看>>
2013-10-10
查看>>
python 抓取的网页默认是bytes的,要转码
查看>>
SFB2015 多SIP域
查看>>
IBM-X3650 6核处理器安装sql server 2005报错解决方法
查看>>
redis 安装错误 jemalloc.h: No such file or directory
查看>>
Ubuntu系统备份和恢复
查看>>
Llinux 磁盘配额的搭建和常规问题解答
查看>>
CentOS利用crontab执行计划任务
查看>>
Mac Generating Pods project Abort trap: 6
查看>>
Oracle错误:ORA-27121: unable to determine size of shared memory segment
查看>>