直接上代码 ( 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();
}
}

 

如何实现文件上传 - JavaWeb的更多相关文章

  1. .JavaWeb文件上传和FileUpload组件使用

    .JavaWeb文件上传 1.自定义上传 文件上传时的表单设计要符合文件提交的方式: 1.提交方式:post 2.表单中有文件上传的表单项:<input type="file" ...

  2. (转载)JavaWeb学习总结(五十)——文件上传和下载

    源地址:http://www.cnblogs.com/xdp-gacl/p/4200090.html 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传 ...

  3. JavaWeb:实现文件上传

    JavaWeb:实现文件上传 理解文件上传: 1.上传文件就是把客户端的文件发送给服务器端. 2.HTTP响应的正文部分最常见的是HTML文档,但是也可以是其他任意格式的数据,如图片和声音文件中的数据 ...

  4. JavaWeb学习总结,文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  5. JavaWeb学习总结(五十)——文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  6. JavaWeb实现文件上传下载功能实例解析

    转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...

  7. JavaWeb——文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  8. JavaWeb项目实现文件上传动态显示进度

    很久没有更新博客了,这段时间实在的忙的不可开交,项目马上就要上线了,要修补的东西太多了.当我在学习JavaWeb文件上传的时候,我就一直有一个疑问,网站上那些博客的图片是怎么上传的,因为当提交了表单之 ...

  9. JavaWeb 文件 上传 下载

    文件上传下载对于一个网站来说,重要性不言而喻.今天来分享一个JavaWeb方式实现的文件上传下载的小例子. 项目依赖 项目目录 工作流程 文件上传 表单处的设置 服务器端 上传功能的实现 upload ...

随机推荐

  1. 面向对象原生JavaScript案例炫彩小球

    面向对象其实对于初学者来说还是比较难以理解的,以前看到一个面试题目 面向对象是什么? 面向对象是一种思想,千万别入坑了: 这次给大家带来的是一个鼠标移动产生小球的案例,不是我不想给大家分享如何去认识面 ...

  2. 初学python之路-day08

    #学习了编码后,还要了解三种字符串.# 一.# 普通字符串:u''以字符作为输出单位,# print(u'abc') # 用于显示abc# # 二进制字符串:b'' 二进制字符串以字节作为输出单位# ...

  3. Google 以 Flutter 作为原生突破口,移动端即将统一了

    Android 的前生今世 Android 系统 Android系统作为全球第一大系统,基于 Java 开发的移动端有着诸多的性能优势. 2018年前 H5 的性能瓶颈和 RN 的停更 导致业界对跨平 ...

  4. 关于Java中构造方法的问题以及回答

    构造方法 概念: 又叫 构造器,区分于传统的方法,是一个在创建对象时被系统自动调用的特殊方法 作用: 一:为对象进行初始化(成员变量)的工作 二:为对象在堆内存中开辟独立的内存空间 定义格式: 访问修 ...

  5. eclipse中jetty插件安装

    注:本文来源于:<eclipse中jetty插件安装> 一.eclipse中jetty插件安装: 打开eclipse,依次点击菜单Help->Eclipse Marketplace, ...

  6. vue搭建app, M端项目流程

    思路:安装sass预处理嵌套css,flex布局,flexible手机淘宝适配和fastclick移动300s延迟 打开cmd,使用命令行 1.切换盘符:e: 2.使用vue建立一个项目,具体请看我的 ...

  7. 如何隐藏nginx版本号

    vi /etc/nginx/nginx.conf 配置文件中,http区段中插入“server_tokens  off;”,重新载入配置文件 worker_processes 1; events { ...

  8. 网络流24题——魔术球问题 luogu 2765

    题目描述:这里 这道题是网络流问题中第一个难点,也是一个很重要的问题 如果直接建图感觉无从下手,因为如果不知道放几个球我就无法得知该如何建图(这是很显然的,比如我知道 $1+48=49=7^2$ ,可 ...

  9. css3基本属性

    一.css属性:1.层叠性:当出现相同的选择器时,属性冲突的时候,后面的属性会把前面的属性 覆盖掉. 2.继承:当存在父子关系的时候,子元素会继承父元素的部分属性 注意: a标签不会继承颜色:h标签不 ...

  10. Linux-进程描述(1)—进程控制块

    进程概念介绍 进程是操作系统对运行程序的一种抽象. • 一个正在执行的程序: • 一个正在计算机上执行的程序实例: • 能分配给处理器并由处理器执行的实体: • 一个具有普以下特征的活动单元:一组指令 ...