需求:通过ajax文件上传至Struct2后台,再通过http请求将文件传输到SpringBoot搭建的专门上传文件的服务端。
通过ajaxload上传文件至后端,前端代码:
<form id="fileForm" method="post" enctype="multipart/form-data" >
文件:
<input type="file" name="upFile" id="upFile" multiple="multiple" >
</form>
通过form和input实现前端选中文件,input加上 multiple="multiple" 属性则可以实现多选。
js代码为:
$.ajaxFileUpload({ //Jquery插件上传文件
url: '', //填写你要传的url路径
type: 'post',
fileElementId: "upFile", //type="file"的id
dataType: "JSON", //返回值类型
async : true, //是否是异步
success: function(data) {
if(data.indexOf("success") != -1){
}
}
})
fileElementId 对应 type="file"的id,这样才可以读取到通过input上传文件的内容。因为我使用是Struct2,后台可以通过request请求获取到传过来的文件内容。
后台接受代码:
HttpServletRequest request = ServletActionContext.getRequest();
MultiPartRequestWrapper wrapper = (MultiPartRequestWrapper) request;
// 将上传的文件转化成file数组
File[] upFiles = wrapper.getFiles("upFile");
一开始是想直接通过ajaxUploadFIle将文件传到另外一个专门上传文件的服务端,但是这样做的后果是没办法对ajax调用成功与否进行判断。因此才先到上传文件的系统的后台,再通过这个系统http请求调用上传文件的服务端,成功与否则可以通过HttpResponse进行判断。
通过http请求传输文件,需要将文件类型变为MultipartFile类型,再以字节流的形式存入MultipartEntityBuilder中。
File转变为MultipartFile:
input = new FileInputStream(file);
MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain", IOUtils.toByteArray(input));
MultipartFile通过http请求传输:
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost("http请求url地址");
//BROWSER_COMPATIBLE自定义charset,RFC6532=utf-8,STRICT=iso-8859-1
//此处一定要用RFC6532,网上普遍用的BROWSER_COMPATIBLE依然会出现中文名乱码
MultipartEntityBuilder builder = MultipartEntityBuilder.create().setMode(HttpMultipartMode.RFC6532);
// 循环插入文件流至binaryBody中自动会变成list
for (MultipartFile file : multipartFileList) {
String fileName = file.getOriginalFilename();
builder.addBinaryBody("upFile", file.getInputStream(), ContentType.MULTIPART_FORM_DATA, fileName);// 文件流
builder.addTextBody("upFile", fileName);// 类似浏览器表单提交,对应input的name和value
}
HttpEntity entity = builder.build();
httpPost.setEntity(entity);
HttpResponse response = httpClient.execute(httpPost);// 执行提交
int statusCode = response.getStatusLine().getStatusCode();
if(statusCode == 200){
// 成功
}
文件上传服务端接受文件:
StandardMultipartHttpServletRequest request1 = (StandardMultipartHttpServletRequest) request;
MultiValueMap<String, MultipartFile> multiFileMap = request1.getMultiFileMap();
// 获取文件列表
List<MultipartFile> fileList = multiFileMap.get("upFile");
这样就获取到整个文件List了,在此就可以对文件进行各种操作,通过获取文件上的内容来进行数据库读写操作。