springboot网站开发-使用MultipartFile上传图片文件到远程服务器!昨天上午在准备网站的一些 图片,下午在测试图片上传的模块,走了一些弯路,今天和大家分享一下,免得大家再走弯路。
首先,要和大家声明一件事,maven(父子嵌套模式的项目),平级项目之间的组件调用,务必要保证,代码的存档路径一致才行,否则就会出现加载失败,提示找不到对象,报错null.
如图所示,这种错误,不仅会影响代码本身的执行,甚至会阻碍你开启DEbug模式。非常痛苦。
请大家务必保证包的存档路径一样。就可以正常植入,加载调用成功了。
核心思想,java上传核心设计,就是把文件用字节流(存档到指定的文件夹内)。这属于java基础知识,不再过多解释了。不懂的自己去百度一下。
package com.blog.utils;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 文件上传工具类,可以把指定的文件上传到指定的目录里
*/
public class FileUtils {
public static String uploadFile(byte[] file, String filePath, String fileName) throws Exception {
File targetFile = new File(filePath);
//父目录不存在则创建
if(!targetFile.exists()){
targetFile.mkdirs();
}
BufferedOutputStream bos = null;
FileOutputStream fos = null;
try {
File temp = new File(filePath+fileName);
if (!temp.exists())
temp.createNewFile();
fos = new FileOutputStream(temp);
bos = new BufferedOutputStream(fos);
bos.write(file);
//返回存档路径,
return filePath+fileName;
} catch (Exception e) {
e.printStackTrace();
return "service exist exception";
} finally {
if (bos != null)
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null)
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
使用了原始的FileOutputStream文件流操作存档。为了提升效率,开启了一个缓存流,套在了文件流的外层。用完后记得随时关闭流接口。
如图,上传成功。
@RequestMapping(value = "/foThumb",method= RequestMethod.POST)
public ResponseResult uploadFoImg( @RequestParam("file") MultipartFile file){
ResponseResult result = new ResponseResult();
String isExist = foService.uploadFoThumb(file);
System.out.println("文件存档路径:"+isExist);
if(!"".equals(isExist)){
result.setCode(SystemConstants.FILE_UPLOAD_SUCCESS);
result.setMsg("文件上传成功");
}else{
//FILE_UPLOAD_ERROR
result.setCode(SystemConstants.FILE_UPLOAD_ERROR);
result.setMsg("文件上传失败");
}
return result;
}
这个就是前端控制器的一个方法,响应上传的方法。里面的requestParam("file"),其实是用来映射前端body参数的名字了。如果你的参数名字和后端业务接口的参数名字一样,不需要这个修饰方法的。如果前后端参数名字不一样,你必须用它修饰一下。后端才能正确映射成功,否则还是会报错null.
如果你是一个懒汉,你们公司对代码要求不严格,你可以直接把上传存档代码写入控制器内。
@RequestMapping(value = "/foThumb2",method= RequestMethod.POST)
public String uploadFoImg2( @RequestParam("file") MultipartFile file){
String contentType = file.getContentType();
String fileName2 = file.getOriginalFilename();
System.out.println("contentYpe:" + contentType + "--filname:" + fileName2);
//foService.uploadChengjiPeitu(file);
//开始
try {
byte[] bytes = null;
//C:\jide\images
String uploadDir = "C:\\jide\\images\\";
String fileRrealName = file.getOriginalFilename();
long time = System.currentTimeMillis();
String t = String.valueOf(time / 1000L);
String fileName = t + fileRrealName.substring(fileRrealName.lastIndexOf("."));
String filePath = uploadDir + fileName;
// 给后端发布人员看见的显示图片的路径地址。这是一个相对地址。不是物理路径。
String xianshisrc = fileName;
BufferedOutputStream bos = null;
FileOutputStream fos = null;
try {
bytes = file.getBytes();
//创建封装对象file
File temp = new File(filePath);
if (!temp.exists())
temp.createNewFile();
fos = new FileOutputStream(temp);
bos = new BufferedOutputStream(fos);
bos.write(bytes);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bos != null)
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null)
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
//结束
System.out.println("上传成功");
return "上传成功";
}