springMVC spring-cloud html5 文件上传

1.     SpringMVC框架的文件上传

a)     前台

  1.  使用表单文件域完成文件上传,需要在表单中增加相应标签:

<input type=”file” name=”xxxx”>

  1.  表单必须采用POST方式提交数据,因为文件数据放置在请求体中传递,GET方式处理不了,没有请求体。
  2.  文件上传采用特殊的方式传递数据,而不是普通的名值对方式,

    采用多部件方式提交,   所以在表单标签中需要增加特定属性 :

enctype=”multipart/form-data

b)     配置

      springMVC框架需要提供文件上传解析器,需要在配置文件中进行配置,如果是SpringBoot框架,默认已经进行配置,可以直接使用

c)      后台

  1.   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);

             });

猜你喜欢

转载自www.cnblogs.com/5769-ftl/p/9023608.html