1. SpringMVC框架的文件上传
a) 前台
- 使用表单文件域完成文件上传,需要在表单中增加相应标签:
<input type=”file” name=”xxxx”>
- 表单必须采用POST方式提交数据,因为文件数据放置在请求体中传递,GET方式处理不了,没有请求体。
- 文件上传采用特殊的方式传递数据,而不是普通的名值对方式,
采用多部件方式提交, 所以在表单标签中需要增加特定属性 :
enctype=”multipart/form-data”
b) 配置
springMVC框架需要提供文件上传解析器,需要在配置文件中进行配置,如果是SpringBoot框架,默认已经进行配置,可以直接使用
c) 后台
- springMVC框架对请求进行了封装,所以可以通过封装后的请求对象来获取上传的文件数据
2. Spring Cloud文件上传
在Spring Cloud项目中,应用和服务间数据的交互一般采用feign的方式。基本使用没有问题,而且也比较方便,但是进行文件数据的交互就比较麻烦了,所以需要采用其他的方式进行处理。
我们一般创建一个web应用后,需要通过Web浏览器对这个应用中的功能进行访问,然后在浏览器中显示处理的结果(HTML)或进行JS逻辑处理(JSON),但是在某些时候,我们希望在JAVA程序代码中也可以访问这个web系统中的功能,那么就可以采用Spring 3.0框架中的RestTemplate来完成。
RestTemplate简化了发起HTTP请求以及处理响应的过程,简单来说,就是操作web服务更加的容易了。代码操作如下:
文件上传(发文件)
在Application类中增加RestTemplate配置: @Bean public RestTemplate restTemplate() { return new RestTemplate(); } |
在Controller中,自动配置对应的属性 @Autowired private RestTemplate restTemplate; |
在逻辑方法中,调用restTemplate对象,将文件上传给远程web服务 MultipartFile file = XXXXXX; HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); String uuid = UUID.randomUUID().toString(); String fileName = file.getOriginalFilename(); final File tempFile = File.createTempFile(uuid, fileName.substring(fileName.lastIndexOf("."))); file.transferTo(tempFile); FileSystemResource resource = new FileSystemResource(tempFile); MultiValueMap<String, Object> param = new LinkedMultiValueMap<>(); param.add("pdfile", resource); restTemplate.postForObject("http://service-name/url",param,String.class); |
文件上传(接收文件)
在web服务的处理方法中增加对应的请求参数接收文件即可 public String depolyProcDef( @RequestParam("pdfile") MultipartFile file ) |
文件下载(发文件)
在Web服务的处理方法中返回字节数组。逻辑中将文件转换为流后再转换为字节数组即可
public byte[] loadImgById(String id) { InputStream in = XXXXX; ByteArrayOutputStream swapStream = new ByteArrayOutputStream(); byte[] buff = new byte[100]; //buff用于存放循环读取的临时数据 int rc = 0; try { while ((rc = in.read(buff, 0, 100)) > 0) { swapStream.write(buff, 0, rc); } } catch (IOException e) { e.printStackTrace(); } byte[] in_b = swapStream.toByteArray(); //in_b为转换之后的结果
return in_b; } |
在Web服务的处理方法中返回字节数组。逻辑中将文件转换为流后再转换为字节数组即可
public byte[] loadImgById(String id) { InputStream in = XXXXX; ByteArrayOutputStream swapStream = new ByteArrayOutputStream(); byte[] buff = new byte[100]; //buff用于存放循环读取的临时数据 int rc = 0; try { while ((rc = in.read(buff, 0, 100)) > 0) { swapStream.write(buff, 0, rc); } } catch (IOException e) { e.printStackTrace(); } byte[] in_b = swapStream.toByteArray(); //in_b为转换之后的结果
return in_b; } |
文件下载(接收文件)
采用RestTemplate在逻辑方法中接收返回的字节数组再转换为流生成文件即可 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.IMAGE_PNG);
String url = "http://service-name/url"; ResponseEntity<byte[]> response = restTemplate.exchange( url, HttpMethod.POST, new HttpEntity<byte[]>(headers), byte[].class); byte[] result = response.getBody();
InputStream in = new ByteArrayInputStream(result); OutputStream out = resp.getOutputStream();
int i = -1; while ( (i = in.read()) != -1 ) { out.write(i); } |
3. HTML5文件上传
浏览器客户端判断上传文件的大小。
$("#文件域对象ID").change(function(event){
// 获取当前选择的文件 event.target.files
var files = event.target.files, file;
if (files && files.length > 0) {
file = files[0];
}
// 判断上传文件的大小 file.size ,单位字节Byte
// 判断上传文件的类型 file.type
// 本地生成上传文件后的临时文件地址
var URL = window.URL || window.webkitURL;
var imgURL = URL.createObjectURL(file);
});