需求:将文件上传到远程服务器,并提供下载功能。
解决方式:利用Apache2、Tomcat或者FTP搭建文件服务器。
关于Apache2、Tomcat、FTP的部署网上教程很多就不细说了。这三种我都使用过,主要分成两个方法:
如ftp可以与java项目连接后直接对其进行上传下载操作,这种方法网上有不少教程;
而如果使用Apache2、Tomcat没办法直接对其上传,使用只能在服务器部署一个项目来完成对服务器文件的操作,下面主要讲的就是这种如何实现。搭建好Apache2、Tomcat、FTP中的一个服务后,建立一个保存文件的目录,我用的apache2,所以把文件放在了/var/www/下面建了一个file文件夹。然后需要两个springboot项目,一个作服务端一个做客户端。
客户端:
前端页面:
<input id="cert" type="file" onchange="submit()" />
function submit() {
var formData = new FormData();
formData.append('file', $("#cert")[0].files[0]); //生成一对表单属性
console.log(formData)
$.ajax({
type: "POST", //因为是传输文件,所以必须是post
url: '/upload', //对应的后台处理类的地址
data: formData,
processData: false,
contentType: false,
success: function(data) {
}
});
}
客户端后台接口:
@ApiOperation(value = "上传图片接口")
@PostMapping(value = "/upload")
public String upload(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return "失败";
}
JSONObject postData = new JSONObject();
String fileName = file.getOriginalFilename();//上传的文件名
String suffixName = fileName.substring(fileName.lastIndexOf("."));//获取后缀
fileName = UUID.randomUUID() + suffixName;//生成唯一文件名
try {
byte[] fileBytes = file.getBytes();//转换为byte数组
postData.put("fileName",fileName);
postData.put("data",fileBytes);
RestTemplate client = new RestTemplate();
//FilePath是你服务端的项目接口路径
JSONObject json = client.postForEntity(FilePath, postData, JSONObject.class).getBody();
logger.info("上传成功");
return json.get("data");//返回文件下载地址
} catch (IOException e) {
logger.error(e.toString(), e);
}
logger.info("上传失败");
return "失败";
}
上传成功后返回的就是文件的下载地址。
服务端接口:
@RestController
@RequestMapping(value = "upload")
@Slf4j
public class API {
/**
* 访问服务器文件路径端口
*/
@Value(value="${filePath}")
private String imgPath;
/**
* 服务器保存文件路径
*/
@Value(value="${uploadHost}")
private String uploadHost;
/**
* 项目host路径
*/
@ApiOperation(value = "上传图片接口", notes = "")
@PostMapping(value = "/upImg")
public JSONObject upImg(@RequestBody String json) {
JSONObject jsonObject =new JSONObject();
byte[] bfile = JSONObject.parseObject(json).getBytes("data");
String fileName =JSONObject.parseObject(json).getString("fileName");
byte2File(bfile,uploadHost,fileName);
if (json.isEmpty()) {
return null;
}
try {
log.info("上传成功");
jsonObject.put("data",imgPath+fileName);
return jsonObject;
} catch (Exception e) {
log.info("上传失败");
jsonObject.put("message",e.toString());
}
return jsonObject;
}
//byte数组转file文件方法
public static void byte2File(byte[] bfile,String filePath,String fileName){
BufferedOutputStream bos=null;
FileOutputStream fos=null;
File file=null;
try{
File dir=new File(filePath);
if(!dir.exists() && !dir.isDirectory()){//判断文件目录是否存在
dir.mkdirs();
}
file=new File(filePath+fileName);
fos=new FileOutputStream(file);
bos=new BufferedOutputStream(fos);
bos.write(bfile);
}
catch(Exception e){
System.out.println(e.getMessage());
e.printStackTrace();
}
finally{
try{
if(bos != null){
bos.close();
}
if(fos != null){
fos.close();
}
}
catch(Exception e){
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
}
服务端配置文件application.yml
server:
port: 8099
#访问服务器文件路径端口
filePath: http://你的IP:88/
#服务器保存文件路径
uploadHost: /var/www/file/