application.yml
upload:
localtion:
windows:
/system
/uploadFile
/
linux:
/var
/local/system
/uploadFile
/
mac:
/Users
/primrose
/Desktop
/uploadFile
/
maxFileSize:
10240KB
maxRequestSize:
102400KB
FileController
import com
.alibaba
.fastjson
.JSON
;
import com
.youruan
.common
.utils
.DateUtil
;
import com
.youruan
.framework
.config
.UploadProperties
;
import com
.youruan
.framework
.config
.model
.FileUploadResponse
;
import io
.swagger
.annotations
.Api
;
import io
.swagger
.annotations
.ApiImplicitParam
;
import io
.swagger
.annotations
.ApiOperation
;
import org
.slf4j
.Logger
;
import org
.slf4j
.LoggerFactory
;
import org
.springframework
.core
.io
.FileSystemResource
;
import org
.springframework
.core
.io
.InputStreamResource
;
import org
.springframework
.core
.io
.ResourceLoader
;
import org
.springframework
.http
.HttpHeaders
;
import org
.springframework
.http
.MediaType
;
import org
.springframework
.http
.ResponseEntity
;
import org
.springframework
.web
.bind
.annotation
.*
;
import org
.springframework
.web
.multipart
.MultipartFile
;
import javax
.annotation
.Resource
;
import javax
.servlet
.ServletOutputStream
;
import javax
.servlet
.http
.HttpServletRequest
;
import javax
.servlet
.http
.HttpServletResponse
;
import java
.io
.*
;
import java
.nio
.file
.Paths
;
import java
.util
.ArrayList
;
import java
.util
.Date
;
import java
.util
.List
;
import java
.util
.regex
.Pattern
;
@Api(value
= "文件管理", tags
= {"文件的上传"})
@RestController
public class FileController {
private Logger log
= LoggerFactory
.getLogger(FileController
.class);
@Resource
private ResourceLoader resourceLoader
;
@Resource
private UploadProperties uploadProperties
;
private String reg
= "(mp4|flv|avi|rm|rmvb|wmv)";
@PostMapping("/upload")
@ApiOperation(value
= "保存", notes
= "保存一条数据信息")
@ApiImplicitParam(paramType
= "header", dataType
= "String", name
= "Authorization", value
= "'Bearer '", required
= true)
public List
<FileUploadResponse> upload(@RequestParam("file") MultipartFile
[] files
, HttpServletRequest request
) {
List
<FileUploadResponse> list
= new ArrayList<FileUploadResponse>();
String path
= uploadProperties
.getBasePath() + DateUtil
.format(new Date(), "yyyyMMdd") + "/";
File targetFile
= new File(path
);
if (!targetFile
.exists()) {
targetFile
.mkdirs();
}
for (MultipartFile file
: files
) {
FileUploadResponse rs
= new FileUploadResponse();
String contentType
= file
.getContentType();
String originalFilename
= file
.getOriginalFilename();
String fileName
= String
.valueOf(System
.currentTimeMillis()) + originalFilename
.substring(originalFilename
.lastIndexOf("."));
try {
BufferedOutputStream out
= new BufferedOutputStream(new FileOutputStream(new File(path
+ fileName
)));
out
.write(file
.getBytes());
out
.flush();
out
.close();
rs
.setContentType(contentType
);
rs
.setFileName(fileName
);
if (path
.contains("/var/local")) {
String str
= "/var/local";
int index
= path
.indexOf("/var/local") + str
.length();
System
.out
.println(index
);
path
= path
.substring(index
, path
.length());
}
rs
.setUrl(path
+ fileName
);
rs
.setType("success");
rs
.setMsg("文件上传成功");
log
.info("文件上传成功:" + JSON
.toJSONString(rs
));
} catch (Exception e
) {
rs
.setType("fail");
rs
.setMsg("文件上传失败");
log
.error("上传文件失败:" + e
);
}
list
.add(rs
);
}
return list
;
}
@GetMapping(value
= "/Users/primrose/Desktop/uploadFile/{date}/{filename:.+}")
public ResponseEntity
<?> getFileForMac(@PathVariable String date
, @PathVariable String filename
,HttpServletRequest request
, HttpServletResponse response
) throws IOException
{
Pattern p
= Pattern
.compile(reg
);
boolean boo
= p
.matcher(filename
).find();
if(boo
){
String path
= Paths
.get(uploadProperties
.getBasePath() + File
.separator
+ date
, filename
).toString();
File file
= new File(path
);
sendVideo(request
, response
, file
, filename
);
}else{
try {
return ResponseEntity
.ok(resourceLoader
.getResource("file:" + Paths
.get(uploadProperties
.getBasePath()
+ File
.separator
+ date
, filename
).toString()));
} catch (Exception e
) {
return ResponseEntity
.notFound().build();
}
}
return null
;
}
@RequestMapping(value
= "/download", method
= RequestMethod
.GET
)
public ResponseEntity
<InputStreamResource> downloadFile(@RequestParam String fileName
)
throws IOException
{
String classpath
= "D:\\system";
String filePath
= classpath
+ fileName
;
FileSystemResource file
= new FileSystemResource(filePath
);
HttpHeaders headers
= new HttpHeaders();
headers
.add("Cache-Control", "no-cache, no-store, must-revalidate");
headers
.add("Content-Disposition", String
.format("attachment; filename=\"%s\"", file
.getFilename()));
headers
.add("Pragma", "no-cache");
headers
.add("Expires", "0");
return ResponseEntity
.ok()
.headers(headers
)
.contentLength(file
.contentLength())
.contentType(MediaType
.parseMediaType("application/octet-stream"))
.body(new InputStreamResource(file
.getInputStream()));
}
@GetMapping(value
= "/system/uploadFile/{date}/{filename:.+}")
public ResponseEntity
<?> getFile(@PathVariable String date
, @PathVariable String filename
,HttpServletRequest request
, HttpServletResponse response
)
throws FileNotFoundException
, IOException
{
Pattern p
= Pattern
.compile(reg
);
boolean boo
= p
.matcher(filename
).find();
if(boo
){
String path
= Paths
.get(uploadProperties
.getBasePath() + File
.separator
+ date
, filename
).toString();
File file
= new File(path
);
sendVideo(request
, response
, file
, filename
);
}else{
try {
return ResponseEntity
.ok(resourceLoader
.getResource("file:" + Paths
.get(uploadProperties
.getBasePath()
+ File
.separator
+ date
, filename
).toString()));
} catch (Exception e
) {
return ResponseEntity
.notFound().build();
}
}
return null
;
}
private void sendVideo(HttpServletRequest request
, HttpServletResponse response
, File file
, String fileName
)
throws FileNotFoundException
, IOException
{
RandomAccessFile randomFile
= new RandomAccessFile(file
, "r");
long contentLength
= randomFile
.length();
String range
= request
.getHeader("Range");
int start
= 0, end
= 0;
if(range
!= null
&& range
.startsWith("bytes=")){
String
[] values
= range
.split("=")[1].split("-");
start
= Integer
.parseInt(values
[0]);
if(values
.length
> 1){
end
= Integer
.parseInt(values
[1]);
}
}
int requestSize
= 0;
if(end
!= 0 && end
> start
){
requestSize
= end
- start
+ 1;
} else {
requestSize
= Integer
.MAX_VALUE
;
}
byte[] buffer
= new byte[4096];
response
.setContentType("video/mp4");
response
.setHeader("Accept-Ranges", "bytes");
response
.setHeader("ETag", fileName
);
response
.setHeader("Last-Modified", new Date().toString());
if(range
== null
){
response
.setHeader("Content-length", contentLength
+ "");
}else{
response
.setStatus(HttpServletResponse
.SC_PARTIAL_CONTENT
);
long requestStart
= 0, requestEnd
= 0;
String
[] ranges
= range
.split("=");
if(ranges
.length
> 1){
String
[] rangeDatas
= ranges
[1].split("-");
requestStart
= Integer
.parseInt(rangeDatas
[0]);
if(rangeDatas
.length
> 1){
requestEnd
= Integer
.parseInt(rangeDatas
[1]);
}
}
long length
= 0;
if(requestEnd
> 0){
length
= requestEnd
- requestStart
+ 1;
response
.setHeader("Content-length", "" + length
);
response
.setHeader("Content-Range", "bytes " + requestStart
+ "-" + requestEnd
+ "/" + contentLength
);
}else{
length
= contentLength
- requestStart
;
response
.setHeader("Content-length", "" + length
);
response
.setHeader("Content-Range", "bytes "+ requestStart
+ "-" + (contentLength
- 1) + "/" + contentLength
);
}
}
ServletOutputStream out
= response
.getOutputStream();
int needSize
= requestSize
;
randomFile
.seek(start
);
while(needSize
> 0){
int len
= randomFile
.read(buffer
);
if(needSize
< buffer
.length
){
out
.write(buffer
, 0, needSize
);
} else {
out
.write(buffer
, 0, len
);
if(len
< buffer
.length
){
break;
}
}
needSize
-= buffer
.length
;
}
randomFile
.close();
out
.close();
}
}
UploadProperties
package com
.youruan
.examine
.config
;
import org
.springframework
.boot
.context
.properties
.ConfigurationProperties
;
import org
.springframework
.stereotype
.Component
;
import java
.util
.Map
;
@Component
@ConfigurationProperties("upload")
public class UploadProperties {
private Map
<String, String> localtion
;
private String maxFileSize
;
private String maxRequestSize
;
public Map
<String, String> getLocaltion() {
return localtion
;
}
public void setLocaltion(Map
<String, String> localtion
) {
this.localtion
= localtion
;
}
public String
getMaxFileSize() {
return maxFileSize
;
}
public void setMaxFileSize(String maxFileSize
) {
this.maxFileSize
= maxFileSize
;
}
public String
getMaxRequestSize() {
return maxRequestSize
;
}
public void setMaxRequestSize(String maxRequestSize
) {
this.maxRequestSize
= maxRequestSize
;
}
public String
getBasePath() {
String location
;
String os
= System
.getProperty("os.name");
String windows
= "win";
if(os
.toLowerCase().startsWith(windows
)) {
location
= this.getLocaltion().get("windows");
} else if(os
.toLowerCase().startsWith("mac")) {
location
= this.getLocaltion().get("mac");
}else{
location
= this.getLocaltion().get("linux");
}
return location
;
}
@Bean
public MultipartConfigElement
multipartConfigElement() {
MultipartConfigFactory factory
= new MultipartConfigFactory();
factory
.setMaxFileSize("20MB");
factory
.setMaxRequestSize("102400KB");
return factory
.createMultipartConfig();
}
}
FileUploadResponse
package com
.youruan
.examine
.config
.model
;
public class FileUploadResponse {
private String contentType
;
private String fileName
;
private String url
;
private String type
;
private String msg
;
public String
getContentType() {
return contentType
;
}
public void setContentType(String contentType
) {
this.contentType
= contentType
;
}
public String
getFileName() {
return fileName
;
}
public void setFileName(String fileName
) {
this.fileName
= fileName
;
}
public String
getUrl() {
return url
;
}
public void setUrl(String url
) {
this.url
= url
;
}
public String
getType() {
return type
;
}
public void setType(String type
) {
this.type
= type
;
}
public String
getMsg() {
return msg
;
}
public void setMsg(String msg
) {
this.msg
= msg
;
}
}
DateUtil
package com
.youruan
.examine
.util
;
import org
.apache
.commons
.lang3
.StringUtils
;
import org
.slf4j
.Logger
;
import org
.slf4j
.LoggerFactory
;
import java
.text
.DateFormat
;
import java
.text
.ParseException
;
import java
.text
.ParsePosition
;
import java
.text
.SimpleDateFormat
;
import java
.util
.*
;
public class DateUtil {
private static Logger log
= LoggerFactory
.getLogger(DateUtil
.class);
public static final String PATTERN_YM
= "yyyy-MM";
public static final int PATTERN_YM_LENGTH
= 7;
public static final String PATTERN_YMD
= "yyyy-MM-dd";
public static final int PATTERN_YMD_LENGTH
= 10;
public static final String PATTERN_YMD_HM
= "yyyy-MM-dd HH:mm";
public static final int PATTERN_YMD_HM_LENGTH
= 16;
public static final String PATTERN_YMD_HMS
= "yyyy-MM-dd HH:mm:ss";
public static final int PATTERN_YMD_HMS_LENGTH
= 19;
public static final String PATTERN_YMD_HMS_S
= "yyyy-MM-dd HH:mm:ss:SSS";
public static final int PATTERN_YMD_HMS_S_LENGTH
= 23;
public static final String PATTERN_YMDHMS
= "yyyyMMddHHmmss";
public static int getYear(Date date
) {
Calendar c
= Calendar
.getInstance();
c
.setTime(date
);
return c
.get(Calendar
.YEAR
);
}
public static Map
<String, Object> getDateMsg(Date date
) {
Calendar calendar
= Calendar
.getInstance();
calendar
.setTime(date
);
Map
<String, Object> map
= new HashMap<>();
map
.put("year", calendar
.get(Calendar
.YEAR
));
map
.put("month", calendar
.get(Calendar
.MONTH
));
map
.put("day", calendar
.get(Calendar
.DAY_OF_MONTH
));
return map
;
}
public static String
format(Date date
, String pattern
) {
DateFormat format
= new SimpleDateFormat(pattern
);
return format
.format(date
);
}
public static String
format(Date date
, String pattern
, TimeZone timeZone
) {
DateFormat format
= new SimpleDateFormat(pattern
);
format
.setTimeZone(timeZone
);
return format
.format(date
);
}
public static String
format(String date
, String parsePattern
, String returnPattern
) {
return format(parse(date
, parsePattern
), returnPattern
);
}
public static String
format(String date
, String parsePattern
, String returnPattern
, TimeZone timeZone
) {
return format(parse(date
, parsePattern
), returnPattern
, timeZone
);
}
public static Date
timeToDate(Date date
, String format
) {
if (date
== null
) {
return null
;
}
if (StringUtils
.isBlank(format
)) {
format
= "yyyy-MM-dd";
}
SimpleDateFormat sdf
= new SimpleDateFormat(format
);
String str
= sdf
.format(date
.getTime());
return sdf
.parse(str
, new ParsePosition(1));
}
public static Date
parse(String date
, String pattern
) {
SimpleDateFormat format
= new SimpleDateFormat(pattern
);
try {
return format
.parse(date
);
} catch (ParseException e
) {
log
.error("ToolDateTime.parse异常:date值" + date
+ ",pattern值" + pattern
);
return null
;
}
}
public static Date
parse(String date
) {
return parse(date
, PATTERN_YMD_HMS
);
}
public static Date
parseYearAndDay(String date
) {
return parse(date
, PATTERN_YMD
);
}
public static String
getBetween(Date start
, Date end
) {
long between
= (end
.getTime() - start
.getTime()) / 1000;
long day
= between
/ (24 * 3600);
long hour
= between
% (24 * 3600) / 3600;
long minute
= between
% 3600 / 60;
long second
= between
% 60 / 60;
String sb
= String
.valueOf(day
) + "天" + hour
+ "小时" + minute
+ "分";
return sb
;
}
public static int getDateSecondSpace(Date start
, Date end
) {
return (int) ((end
.getTime() - start
.getTime()) / (1000));
}
public static int getDateMinuteSpace(Date start
, Date end
) {
return (int) ((end
.getTime() - start
.getTime()) / (60 * 1000));
}
public static int getDateHourSpace(Date start
, Date end
) {
return (int) ((end
.getTime() - start
.getTime()) / (60 * 60 * 1000));
}
public static int getDateDaySpace(Date start
, Date end
) {
return (int) ((end
.getTime() - start
.getTime()) / (60 * 60 * 24 * 1000));
}
public static boolean isSameDate(Date date1
, Date date2
) {
Calendar cal1
= Calendar
.getInstance();
cal1
.setTime(date1
);
Calendar cal2
= Calendar
.getInstance();
cal2
.setTime(date2
);
boolean isSameYear
= cal1
.get(Calendar
.YEAR
) == cal2
.get(Calendar
.YEAR
);
boolean isSameMonth
= isSameYear
&& cal1
.get(Calendar
.MONTH
) == cal2
.get(Calendar
.MONTH
);
boolean isSameDate
= isSameMonth
&& cal1
.get(Calendar
.DAY_OF_MONTH
) == cal2
.get(Calendar
.DAY_OF_MONTH
);
return isSameDate
;
}
public static String
getWeek(Date date
) {
String
[] weeks
= {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
Calendar cal
= Calendar
.getInstance();
cal
.setTime(date
);
int weekIndex
= cal
.get(Calendar
.DAY_OF_WEEK
) - Calendar
.SUNDAY
;
if (weekIndex
< 0) {
weekIndex
= 0;
}
return weeks
[weekIndex
];
}
public static List
<String> getDaySpaceDate(Date start
, Date end
) {
Calendar fromCalendar
= Calendar
.getInstance();
fromCalendar
.setTime(start
);
fromCalendar
.set(Calendar
.HOUR_OF_DAY
, 0);
fromCalendar
.set(Calendar
.MINUTE
, 0);
fromCalendar
.set(Calendar
.SECOND
, 0);
fromCalendar
.set(Calendar
.MILLISECOND
, 0);
Calendar toCalendar
= Calendar
.getInstance();
toCalendar
.setTime(end
);
toCalendar
.set(Calendar
.HOUR_OF_DAY
, 0);
toCalendar
.set(Calendar
.MINUTE
, 0);
toCalendar
.set(Calendar
.SECOND
, 0);
toCalendar
.set(Calendar
.MILLISECOND
, 0);
List
<String> dateList
= new LinkedList<>();
long dayCount
= (toCalendar
.getTime().getTime() - fromCalendar
.getTime().getTime()) / (1000 * 60 * 60 * 24);
if (dayCount
< 0) {
return dateList
;
}
dateList
.add(format(fromCalendar
.getTime(), PATTERN_YMD
));
for (int i
= 0; i
< dayCount
; i
++) {
fromCalendar
.add(Calendar
.DATE
, 1);
dateList
.add(format(fromCalendar
.getTime(), PATTERN_YMD
));
}
return dateList
;
}
public static Date
calcDateByYear(Date date
, int year
) {
Calendar calendar
= Calendar
.getInstance();
calendar
.setTime(date
);
calendar
.add(Calendar
.YEAR
, year
);
return calendar
.getTime();
}
public static Date
calcDateByDay(Date date
, int day
) {
Calendar calendar
= Calendar
.getInstance();
calendar
.setTime(date
);
calendar
.add(Calendar
.DATE
, day
);
return calendar
.getTime();
}
public static Date
calcDateByHour(Date date
, int hour
) {
Calendar calendar
= Calendar
.getInstance();
calendar
.setTime(date
);
calendar
.add(Calendar
.HOUR
, hour
);
return calendar
.getTime();
}
public static Date
calcDateByMinute(Date date
, int minutes
) {
Calendar calendar
= Calendar
.getInstance();
calendar
.setTime(date
);
calendar
.add(Calendar
.MINUTE
, minutes
);
return calendar
.getTime();
}
public static boolean compareDate(Date start
, Date end
, Date date
) {
return date
.after(start
) && date
.before(end
);
}
public static Date
startDateByDay(Date start
, int end
) {
Calendar calendar
= Calendar
.getInstance();
calendar
.setTime(start
);
calendar
.add(Calendar
.DATE
, end
);
calendar
.set(Calendar
.HOUR_OF_DAY
, 0);
calendar
.set(Calendar
.MINUTE
, 0);
calendar
.set(Calendar
.SECOND
, 0);
calendar
.set(Calendar
.MILLISECOND
, 0);
return calendar
.getTime();
}
public static Date
endDateByDay(Date start
) {
Calendar calendar
= Calendar
.getInstance();
calendar
.setTime(start
);
calendar
.set(Calendar
.HOUR_OF_DAY
, 23);
calendar
.set(Calendar
.MINUTE
, 59);
calendar
.set(Calendar
.SECOND
, 59);
calendar
.set(Calendar
.MILLISECOND
, 999);
return calendar
.getTime();
}
public static Date
startDateByHour(Date start
, int end
) {
Calendar calendar
= Calendar
.getInstance();
calendar
.setTime(start
);
calendar
.set(Calendar
.MINUTE
, end
);
return calendar
.getTime();
}
public static Date
endDateByHour(Date end
) {
Calendar calendar
= Calendar
.getInstance();
calendar
.setTime(end
);
calendar
.set(Calendar
.SECOND
, 59);
calendar
.set(Calendar
.MILLISECOND
, 999);
return calendar
.getTime();
}
public static void main(String
[] args
) {
System
.out
.println(DateUtil
.format(DateUtil
.calcDateByYear(new Date(), 1), "yyyy-MM-dd HH:mm:ss"));
System
.out
.println(DateUtil
.format(DateUtil
.calcDateByDay(new Date(), 1), "yyyy-MM-dd HH:mm:ss"));
System
.out
.println(DateUtil
.format(DateUtil
.calcDateByHour(new Date(), 1), "yyyy-MM-dd HH:mm:ss"));
System
.out
.println(DateUtil
.format(DateUtil
.calcDateByYear(new Date(), -1), "yyyy-MM-dd HH:mm:ss"));
System
.out
.println(DateUtil
.format(DateUtil
.calcDateByDay(new Date(), -1), "yyyy-MM-dd HH:mm:ss"));
System
.out
.println(DateUtil
.format(DateUtil
.calcDateByHour(new Date(), -1), "yyyy-MM-dd HH:mm:ss"));
System
.out
.println(DateUtil
.format(DateUtil
.startDateByDay(new Date(), 0), "yyyy-MM-dd HH:mm:ss"));
System
.out
.println(DateUtil
.format(DateUtil
.endDateByDay(new Date()), "yyyy-MM-dd HH:mm:ss"));
System
.out
.println(DateUtil
.getDateDaySpace(DateUtil
.parse("2015-01-01", "yyyy-MM-dd"), new Date()));
System
.out
.println(DateUtil
.getDaySpaceDate(DateUtil
.parse("2016-04-01 8:00:00", "yyyy-MM-dd HH:mm:ss"), new Date()));
System
.out
.println(DateUtil
.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
System
.out
.println(DateUtil
.parse("2015-11-21 12:34:56", "yyyy-MM-dd HH:mm:ss"));
}
}
Constant
public class Constant {
public final static String ROOT_PATH
= "D:\\system";
}
上传图片实现
图片显示
http://localhost:8090/system/uploadFile/20191101/1572575996741.jpg 直接打开即可