Spring Boot或Spring Cloud迅速完成文件上传
许多情况下我们都必须在Spring Boot或Spring Cloud中迅速集成文件上传功能,可是针对初学者而言提升文件上传功能必须查看许多文本文档。这儿得出了实例可以协助您迅速将文件上传功能集成到系统软件中。
第一步,大家必须在application.yml中配备文件上传的尺寸
spring:
servlet:
multipart:
max-file-size: 1500MB
max-request-size: 1500MB
第二步,为了更好地能迅速解决文件夹名称和URL,我们要使用FilenameUtils,在pom.xml的dependencies中引入Apache Commons IO,留意是不是已经有引入,防止版本矛盾
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
第三步,写一个Controller,解决文件上传的要求
import org.apache.commons.io.FilenameUtils;
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.File;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.UUID;
/**
* 文件上传控制板
*
* @author 杨若瑜
*/
@RestController
@RequestMapping(\"/platform/\")
public class UploadFileController {
// 相对性于新项目根途径的提交途径
private static final String UPLOAD_FOLDER = \"/upload/\";
// 回到给前面的网络服务器根途径(分布式系统、CDN情景很有效)
private static final String URL_SERVER = \"http://127.0.0.1:8080/\";
// 容许提交的文件扩展名
private static final String[] ALLOW_EXTENSIONS = new String[]{
// 照片
\"jpg\", \"jpeg\", \"png\", \"gif\", \"bmp\",
// 压缩文件
\"zip\", \"rar\", \"gz\", \"7z\", \"cab\",
// 音频视频,
\"wav\", \"avi\", \"mp4\", \"mp3\", \"m3u8\", \"ogg\", \"wma\", \"wmv\", \"rm\", \"rmvb\", \"aac\", \"mov\", \"asf\", \"flv\",
// 文本文档
\"doc\", \"docx\", \"xls\", \"xlsx\", \"ppt\", \"pptx\", \"pot\", \"txt\", \"csv\", \"md\", \"pdf\"
};
/**
* 分辨文件夹名称是不是容许提交
* @param fileName 文件夹名称
* @return
*/
public boolean isAllow(String fileName) {
String ext = FilenameUtils.getExtension(fileName).toLowerCase();
for (String allowExtension : ALLOW_EXTENSIONS) {
if (allowExtension.toLowerCase().equals(ext)) {
return true;
}
}
return false;
}
/**
* 文件上传
* @param request 要求
* @param file 文档,与前台接待表单提交的file相一致
* @return 回到JSON
*/
@RequestMapping(\"upload\")
public Object upload(HttpServletRequest request, @RequestParam(\"file\") MultipartFile file) {
String webAppFolder = request.getServletContext().getRealPath(\"/\");
String fileName = file.getOriginalFilename();
if (isAllow(fileName)) {
String ext = FilenameUtils.getExtension(fileName).toLowerCase();
String newFileName = UUID.randomUUID().toString().replace(\"-\", \"\");
// 全自动建立提交文件目录
String targetPath = FilenameUtils.normalize(webAppFolder \"/\" UPLOAD_FOLDER);
String targetFile = FilenameUtils.normalize(targetPath \"/\" newFileName \".\" ext);
new File(targetPath).mkdirs();
try {
String urlPath = URL_SERVER \"/\" UPLOAD_FOLDER \"/\" newFileName \".\" ext;
file.transferTo(new File(targetFile));
Map<String, Object> resJson = new LinkedHashMap<>();
resJson.put(\"status\", \"success\");
resJson.put(\"data\", FilenameUtils.normalize(urlPath,true).replace(\"http:/\",\"http://\").replace(\"https:/\",\"https://\"));
return resJson;
} catch (Exception e) {
e.printStackTrace();
Map<String, Object> resJson = new LinkedHashMap<>();
resJson.put(\"status\", \"error\");
resJson.put(\"message\", \"文件上传不成功:\" e.getMessage());
return resJson;
}
} else {
Map<String, Object> resJson = new LinkedHashMap<>();
resJson.put(\"status\", \"error\");
resJson.put(\"message\", \"该种类文档不允许提交\");
return resJson;
}
}
}
第四步、写一个检测网页页面upload.html,运行并测试一下是不是实用。
<!doctype html>
<html lang=\"zh\">
<head>
<meta charset=\"UTF-8\">
<meta name=\"viewport\"
content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0\">
<meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">
<title>文件上传检测</title>
</head>
<body>
<form action=\"/platform/upload\" method=\"post\" enctype=\"multipart/form-data\">
请选择文件:<input type=\"file\" name=\"file\"><br>
<input type=\"submit\" value=\"提交\">
</form>
</body>
</html>
挑选一张照片,提交
这时后台管理会回到一个JSON,大家开启data所对准的图片看一下是不是上传取得成功:
果真,图片已经上传取得成功
至此,怎么使用Spring Boot或Spring Cloud完成文件上传作用就提到这儿。最终必须填补的是,假如你的应用情景应用ajax或App上传,提交表单种类务必为multipart/form-data,而且以post的方法递交。
这儿放入jQuery的案例:
// userInfoAvatar是一个input,而且type为file
var file = document.getElementById(\'userInfoAvatar\').files[0];
var formData = new FormData();
formData.append(\"file\",file);
$.ajax({
type: \'POST\',
url: \'/platform/upload\',
data: formData,
contentType: false,
processData: false,
dataType: \"json\",
mimeType: \"multipart/form-data\",
success: function(data) {
// 取得成功时调整
},
error : function(data){
// 不成功时调整
}
});
放入axios案例:
// userInfoAvatar是一个input,而且type为file
let file = document.getElementById(\'userInfoAvatar\').files[0];
let formData = new FormData();
formData.append(\"file\",file);
axios({
method: \'POST\',
url: \'/platform/upload\',
data:formData,
headers: {
\'Content-Type\': \'multipart/form-data\'
}
})
.then((data)=>{
console.log(data)
})
.catch((ex)=>{
console.error(ex)
})
放入Http Client Fluent API案例:
String fileName = 文件夹名称;
byte[] bytes = 文档的二进制;
MultipartEntityBuilder builder = MultipartEntityBuilder.create()
.setMode(HttpMultipartMode.BROWSER_COMPATIBLE)
.setCharset(Charset.forName(\"utf-8\"));
builder.addBinaryBody(\"file\", bytes, ContentType.MULTIPART_FORM_DATA, fileName);
String responseJson = Request.Post(\"http://127.0.0.1:8080/platform/upload\")
.connectTimeout(20000)
.socketTimeout(20000)
.body(builder.build())
.execute().returnContent().asString();
System.out.println(responseJson);
别的的架构如出一辙就可以。真真正正放进宣布自然环境以前还记得要加强安全防护,对使用者开展身份验证。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。