前端:常规的二进制form表单,这里不赘述了。
后端:常规的Java servlet处理数据。其关键的代码如下:
String _today = new SimpleDateFormat("yyyyMMdd")
.format(new java.util.Date());
// 保存的最终文件路径(服务器端),其中realwebbase是通过request.getSession().getServletContext().getRealPath("/");方法获取的服务器路径。
String u_name = realwebbase + "upload/letterPic/" + _today
+ "/" + MyUtil.getUUID() + "." + t_ext;
try {
// --------------------5------------------保存文件-----------------------------
File _today_file = new File(realwebbase + "upload/letterPic/" + _today); // 构建文件目录
if (!_today_file.exists()) {
_today_file.mkdirs();
}
fileItem.write(new File(u_name));
hm.put("letter_pic", u_name);//hm是一个作为返回值的HashMap对象
hm.put("msg", "success");
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
这样写的话,在服务器端可以看到最终图片的上传路径为:
图片路径::D:\javasoft\apache-tomcat-6.0.10\webapps\xinyu\upload/letterPic/20170428/e3460fe5-8f81-4fb6-8eba-ae33cbeaa27a.jpg
看到那方向不一致的斜杠,心想:坏了!!果然,打开数据看数据的时候发现
右斜杠并没有作为一个字符写进去(也许写入数据库的时候右斜杠被视为一个转义符号了)。反而写入的是这么一串东西:
---可以发现右斜杠其实已经完全被过滤了。
【为什么会出现这种情况?如何避免?】
这种情况的出现,是因为写入数据库的时候相应处理进程把右斜杠“\”当做转义符了——这样就导致读取文件路径的时候无法找到正确的文件。
网络上的以“\\”代替“\”的方法行不通!这样做获得的一串没有斜杠的字符串;
网络上的以“#6”编码代替“\”的方法也行不通!这样做获得的也是一串没有斜杠的字符串;
正确的解决方法:
1、可以通过替换字符,将转义符换成左斜杠;
2、字符串截取,创建文件/保存文件的时候使用绝对路径,写入数据库的时候用相对路径;