Struct2通过http请求进行跨系统多文件上传

需求:通过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了,在此就可以对文件进行各种操作,通过获取文件上的内容来进行数据库读写操作。

猜你喜欢

转载自blog.csdn.net/qq_20377675/article/details/91422697
今日推荐