本文是文件上传到服务器,包括本地使用tomcat开的文件服务器或者远程的文件服务器
本地使用tomcat开文件服务器请参考另一篇文章:使用tomcat搭建简易文件服务器-CSDN博客
①导入依赖
<!-- web层-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--jersey上传文件用-->
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.18.1</version>
</dependency>
web是必须要有的,因为会用到MultipartFile。
②编写JesyFileUpload的文件上传工具类:
import java.io.IOException;
import java.net.URLEncoder;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
/**
* 跨服务器文件上传工具类
* @author
*/
public class JesyFileUploadUtil {
/**
* 上传文件
*
* @param request --从request对象中获取上传的文件
* @param fileName --文件名
* @param servlerUrl --服务器路径http://127.0.0.1:8080/ssm_image_server
* @return
* @throws IOException
*/
public static Map uploadFile(MultipartFile file,String serverUrl)throws IOException {
System.out.println("文件名:"+file.getOriginalFilename());
//为上传到服务器的文件取名,使用UUID防止文件名重复
String filename=UUID.randomUUID().toString()+"-"+file.getOriginalFilename();
//创建jesy服务器,进行跨服务器上传
Client client =Client.create();
//把文件关联到远程服务器
//http://127.0.0.1:8080/ssm_image_server/upload/123131312321.jpg
WebResource webResource =client.resource(serverUrl +"/" +URLEncoder.encode(filename,"utf-8"));
//上传
webResource.put(file.getBytes());
Mapmap=new HashMap<>();
//图片上传成功后要做的事儿
//1、ajax回调函数做图片回显(需要图片的完整路径)
//2、将图片的路径保存到数据库(需要图片的相对路径)
map.put("flag",1);
map.put("filepath",serverUrl+filename);
map.put("filename",filename);
// //生成一个json响应给客户端
return map;
}
}
③编写一个上传文件的controller:
import com.culturalrelicsys.utils.JesyFileUploadUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.Map;
/**
* 跨域文件上传
*/
@RestController
public class UploadController {
private final String PIC_URL = "http://localhost:8088/uploadfiles/";
@PostMapping(value ="/doRemoteUpload")
@ResponseBody
public Map uploadPic(MultipartFile file) {
//调用跨服务器上传文件的工具类方法上传文件
Map result =null;
try {
result =JesyFileUploadUtil.uploadFile(file,PIC_URL);
System.out.println("文件上传成功");
}catch (IOException e) {
e.printStackTrace();
}
return result;
}
}
④测试:file页面使用ajax上传,或者自己写一个页面用form表单也可以,注意enctype要改为enctype="multipart/form-data"
<html>
<head>
<title>Title</title>
</head>
<body>
选择文件:<input type="file" name="myfile" id="myfile"><br><br>
文件描述:<input type="text" name="description" id="description"><br><br>
<input type="button" value="上传文件" οnclick="ajaxUpload()"><br>
<img src="" alt="" id="img" width="200px">
</body>
<script src="${pageContext.request.contextPath}/statics/scripts/jquery-3.6.0.min.js"></script>
<script>
function ajaxUpload(){
//获取表单数据,并添加到FormData中
let myfile=$("#myfile")[0].files[0];
let description=$("#description").val();
let formData=new FormData();
formData.append("myfile",myfile);
formData.append("description",description);
//发送AJAX请求
$.ajax({
//定义请求地址
url:"${pageContext.request.contextPath}/doRemoteUpload",
//定义请求类型
type:"post",
//定义请求参数(使用js对象)
data:formData,
//告诉jQuery不要去处理发送的数据,我们已经通过FormData处理了
processData:false,
contentType:false,
//定义服务器响应的数据格式为json
dataType:"json",
//成功响应的结果,data就是服务器返回的json对象
success:function(data){
alert(data.msg);
if(data.flag=="1"){
$("#img").attr("src",data.content);
}
}
})
};
</script>
</html>