文档上载,上载也不知道哪个大神(混球)起的名字,读起来怪怪的,反正平时我只读上传。
闲话少说,直入主题。先等等这两天做文件上传,都快把宝宝折磨疯了,不会呀,各种查呀,最可悲的是废了老大功夫学会了传送文档的方法,自测的时候特别顺利,图片名,后缀名等等都可以得到了,终于可以跟前端对接了妹的死活接不上,文件上传失败呀,疯了。。。。。于是找原因呀,终于知道,我测试用的form 表单,前端用的数据流,哎,改吧,命苦不能怪*,谁让人家是资深工程师,我是小白呢,人家随便说句话我就掉坑里了,改吧,人家忙,没空。妥妥的改。
废话说了好多,重点内容与以上吐槽无关。请往下看
/**
* @throws IOException
*
* @category 上传文档
* @Title: uploadImage
* @Description:
* @return void 返回类型
* @throws
*/
protected int uploadFile(HttpServletRequest request, HttpServletResponse response, String saveFilename) {
int size = 1024 * 1024 * 2;
try {
// 上传时生成的文件保存目录
String realSavePath = sp.makePath(saveFilename, sp.getFileSaveRootPath());
// 上传时生成的临时文件保存目录
String tempPath = this.getServletContext().getRealPath(sp.getTemp_Path());
File tmpFile = new File(tempPath);
if (!tmpFile.exists()) {
// 创建临时目录当前已处理
tmpFile.mkdir();
}
//sp.makePath(savePath);
InputStream in = new BufferedInputStream(new DataInputStream(request.getInputStream()), size);
OutputStream out = new BufferedOutputStream(new FileOutputStream(realSavePath ), size);
byte buffer[] = new byte[1024];
// 判断输入流中的数据是否已经读完的标识
int len = 0;
// 循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
while ((len = in.read(buffer)) > 0) {
// 使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\"
// +filename)当
out.write(buffer, 0, len);
}
// 关闭输入流
in.close();
// 关闭输出流
out.close();
return 1;
} catch (IOException e) {
System.out.println("io操作异常");
e.printStackTrace();
return 0;
}
}
注:
saveFilename :是文件名,用于存储到数据库中,便于索引文件。
sp.getFileSaveRootPath():是文件存储地址,存储地址这块遇到一些问题下面会提到。
sp.getTemp_Path()) :当文件过大时,缓存路径。
文件上传时遇到了几个问题以及解决的办法:
问题一:文件地址存储问题。
其一 以存储到相对路径中,一般都是这么搞,所谓相对路径,在这里一般是相对系统的发布路径,也就是说,如果是web项目,tomcat/ebapp文件夹,这目录下会相对存在一个与项目同名的文件夹, 存放项目发布后的资源,上传文档的路径也是以此为根目录的,但是也有人认为是以Root为根目录,对此不太明白,望各位走过路过的大神稍微指点指点。
在这里会遇到一个问题:就是每次重新编译项目,就会出现原来上传的资源消失了的现象,其实这是必然的现象,因为说是更新,其实仔细查看Tomcat的启动流程就会发现,它是先删除原来编译的项目文件,然后再重新编译现在的文件,会出现资源的消失也是必然的。由此引出了下面的解决思路。
其二 可以存储到盘中的任意路径中,这就需要用到Tomcat的一个虚拟存储技术。
所谓虚拟存储,是指将Tomcat下一个虚拟路径,映射到磁盘中的实际路径中去。
实现方式一般有两种,
方式一 tomcat安装目录下conf/servlet.xml中 <HOST>标签下配置
<Context path="/demo" docBase="E:\demo" />
方式二 在conf\Catalina\localhost中添加文件名为test.xml
内容为 <?xml version="1.0" encoding="UTF-8"?>
<Context crossContext="true" docBase="D:\SavePhotos" reloadable="true"/>
即可实现文件的上传。这是项目部署之后的实现方式
如果项目还在本地,一般都会有项目名,那么只需修改文件名为 文件名#test.xml 即可。
问题二。文件名问题。
问题三。文件名后缀问题。