首先搭建一个本地的工程,可以进行web静态资源的访问:
搭建完成之后能够测试访问到静态资源即可,本地图片服务器搭建成功之后,在项目中进行上传图片到图片服务器操作:
使用的是jersey一个整合包,可以完成两台服务器之间的文件通信
/**
* 图片服务器的主机路径
*/
public static final String IMAGE_PATH = "http://localhost:8088/ecps-image";
上传代码:
/**
* 如果是ajax来访问返回值void
* @throws Exception
*
* 常犯2个错误
* 1.忘记修改图片服务器的只读属性,如果没改报403
* 2.上传图片的realPath不对,报409
*/
@RequestMapping("/uploadPic.do")
public void uploadPic(String fileName, HttpServletRequest request, PrintWriter out) throws Exception{
//强制转换request 转换成复杂类型
MultipartHttpServletRequest mr = (MultipartHttpServletRequest) request;
//通过指定的文件名获得指定文件名fileName的文件 页面的名字
MultipartFile mf = mr.getFile(fileName);
//获得文件的字节数组,用这个字节数组读取文件
byte[] bytes = mf.getBytes();
//定义时间戳作为文件名的一部分吗,为了文件名不重复定义时间戳为文件名
String tFileName = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
//定义 Random 随机对象,同样也是为了防止文件名的重复,将"时间戳+随机数"作为文件名
Random random = new Random();
//连续加三位 "时间戳和随机数"
for(int i = 0; i < 3; i++){
//世时间戳+随机数(是10以内的随机数)
tFileName = tFileName + random.nextInt(10);
}
//通过转换后的复杂类型的request获得文件的原始文件名,没有加时间戳的文件名
String oriFileName = mf.getOriginalFilename(); //在电脑硬盘的上的文件名
//获得原始文件的后缀名
String suffix = oriFileName.substring(oriFileName.lastIndexOf("."));
//图片的绝对路径
String realPath = EbConstants.IMAGE_PATH + "/upload/"+tFileName + suffix;
//相对路径
String relativePath = "/upload/"+tFileName + suffix;
//创建Jersey客户端
Client client = Client.create();
//指定web资源
WebResource wr = client.resource(realPath);
//上传图片
wr.put(String.class, bytes);
//{"realPath":realpath, "relativePath":relative};
//创建java里面的json对象
JSONObject jo = new JSONObject();
//在json对象中放入键值对
jo.accumulate("realPath", realPath); //类似于map中的put
jo.accumulate("relativePath", relativePath);
String result = jo.toString();
out.write(result);
}
需要在工程的的tomcat的web.xml中修改:
添加:
是设置服务器的只读属性为false,使用jersey就可以上传成功了.把文件的绝对路径通过WebResource上传到图片服务器上去
//图片的绝对路径
String realPath = EbConstants.IMAGE_PATH + "/upload/"+tFileName + suffix;
Client client = Client.create();
//指定web资源,
WebResource wr = client.resource(realPath);
防止上传到图片服务器的文件丢失,可以在图片服务器的路径里面随便建立一个文件