上传文件
对于上传文件,我们一般要做的事情大多数无非就是保存数据、操作数据、对数据进行转移、或者是操作数据然后进行数据转移、或者是操作数据并保存数据等等。。。
文件数据处理方式
现在对我来说应该有几种:
- 保存数据(保存到本地)
- 直接消费这个文件数据(不保存下来)
- 把该文件数据调用另一个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的方式也有效的避免了找不到文件的异常。
但是,现在还是没有完全清楚其中问题的具体,所以目前来说,以上的做法是治标的方案。别往心里去,能用的,我正在用呢。
时候也不早了,先休息。后面在更新一下这里面的内容