上传文件

对于上传文件,我们一般要做的事情大多数无非就是保存数据、操作数据、对数据进行转移、或者是操作数据然后进行数据转移、或者是操作数据并保存数据等等。。。

文件数据处理方式

现在对我来说应该有几种:

  • 保存数据(保存到本地
  • 直接消费这个文件数据(不保存下来
  • 把该文件数据调用另一个URL发送出去(转移数据

消费数据来说会比较简单,变成文件流的形式,然后放心食用就好。

1.消费上传数据

对于直接消费的方式,这样的代码就足矣:

这个例子主要是把上传文件(按行存储的字符串)的内容放进一个数组里面。例子简单了些,但是主要是为了演示一下消费上传的文件数据的,别介意哈。

@PostMapping("/handle-upload-file")
public DataReturnDTO handleUploadFile(@RequestParam MultipartFile multipartFile) {
    // 这个是我自定义的一个返回对象封装,先不管这个
    DataReturnDTO result; 
    ArrayList<String> words = new ArrayList<String>();
    String oneWord;

    // 我们在这里进行上传文件的处理
    try {
        InputStreamReader isr = new InputStreamReader(multipartFile.getInputStream());
        BufferedReader br = new BufferedReader(isr);

        /* 然后在这里进行 br 的处理 */
        while ((oneWord = br.readLine()) != null) {
            words.add(oneWord); 
        }
    } catch (IOException e) { 
    // 一般来说会出现 FileNotFoundException,但是try里面的做法就是为了避免这样的。
        e.printStackTrace();
    }
    return result;
}

但是,要保存数据下来或者是把数据进行转移的时候,问题就来了。往往会一不小心出现了 FileNotFoundException,真的头疼。对于不清楚 Springboot 机制的我来说,就无从下手嘛。。。

2.上传文件直接转移

对于两个都是 Spring 的上传文件来说

对于需要把这个上传的文件进行直接调用其他的URL(也是上传的URL)的情况来说,把拿到的multipartFile,直接上传过去是会出错的。但是,网上大多数都是说,需要暂存下来,然后以文件流的方式发送的出去。是会成功,但是会经常出现 FileNotFoundException的异常,无意间在 stackoverflow找到的方案,分享一下:

还是以上面的例子为模板

@PostMapping("/handle-upload-file")
public DataReturnDTO handleUploadFile(@RequestParam MultipartFile multipartFile) {
    // 这个是我自定义的一个返回对象封装,先不管这个
    DataReturnDTO result; 
    ArrayList<String> words = new ArrayList<String>();
    String oneWord;

    // 我们在这里进行上传文件的转移
    try {
       byte[] bytes = multipartFile.getBytes();
       String fileName = multipartFile.getOriginalFilename();
       ByteArrayResource resource = new ByteArrayResource(bytes){
           @Override
           public String getFilename(){return fileName;}
       };
       
      // 然后,这个 resource 就可以作为一个上传文件的Object来用了。
       HashMap<String, Object> hashMap = new HashMap<>();
       hashMap.put("file", resource);
       RestTemplate restTemplate = new RestTemplate();

       /* 这里的 url 需要指定的是另外一个上传文件的地址 */
       String result = restTemplate.postForEntity(url, hashMap, String.class);
    
    } catch (IOException e) { 
    // 一般来说会出现 FileNotFoundException,但是try里面的做法就是为了避免这样的。
        e.printStackTrace();
    }
    return result;
}

OK,到这里,还差一个。那就是保存上传的文件。

3.上传文件的保存

这里呢,就需要一个File的实例咯,不然怎么保存呢?你说是吧。

/* java 代码,抱歉这个我还没有测试完,先不写了 */

总结

从上面的说明来说,有一个还没有说明的,就是 Spring 上传文件之后,会保存在一个临时的路径,我个人觉得这个路径的数据及其的不稳定,导致一不小心你的缓存数据就没有了,或者是找不到了。根据这样的情况,前面 1、2的方式也有效的避免了找不到文件的异常。

但是,现在还是没有完全清楚其中问题的具体,所以目前来说,以上的做法是治标的方案。别往心里去,能用的,我正在用呢。

时候也不早了,先休息。后面在更新一下这里面的内容