一 Java Web文件上传程序
页面中用html或某个js框架,弹出选择上传文件界面,用户选择文件后上传;传到服务器上调用servlet进行处理,把接受到的内容写入服务器相应目录。Java Web上传都是这个思路,网上有很多例子,就不再多说了。
本项目的servlet主体代码如下:
//上传文件实际保存路径
uploadPath=request.getSession().getServletContext().getRealPath("/dddd");
//uploadPath="/var/lib/tomcat6/webapps/xxxx/dddd/";
if (ServletFileUpload.isMultipartContent(request)) {
try {
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024);
factory.setRepository(new File(repositoryPath));//设置临时目录
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
upload.setSizeMax(1024 * 1024 * 1024);//设置文件大小
List<FileItem> items = upload.parseRequest(request);
for (FileItem item : items) {
if (!item.isFormField()) {// 如果是文件类型
name = item.getName();// 获得文件名
if (name != null) {
File savedFile = new File(uploadPath, name);
item.write(savedFile);
}
}
}
response.getWriter().write("{\"status\":true,\"newName\":\""+name+"\"}");
} catch (FileUploadException e) {
e.printStackTrace();
response.getWriter().write("{\"status\":false}");
} catch (Exception e) {
e.printStackTrace();
}
如果服务器为Windows,一切正常;服务器为Linux则上传失败;
初认为是路径问题,因为Windows和Linux的路径写法不同;不过对于Linux,下面两种写法,一种是从上下文获取路径,一种直接写绝对路径,都不能上传;
uploadPath=request.getSession().getServletContext().getRealPath("/dddd");
//uploadPath="/var/lib/tomcat6/webapps/xxxx/dddd/";
二 用js调试控制台,在chrome下打F12,调出js调试控制台,找到要调试的js或jsp,切到sources选项卡,在源代码中下断点,在这里下断点调试,没发现什么可用信息;
三 然后看tomcat控制台输出信息,这个在Linux下不像Windows下有个控制台的面板可看;在linux下进入tomcat的logs目录,打命令tail -f catalina.out可看到tomcat控制台的输出;
这个查看会自己刷新,如果要退出查看,打Ctrl+C,返回到linux命令行界面;
通过这个图可以看到错误代码在AddPicOtherServlet.java的57行;
56 File savedFile = new File(uploadPath, name);
57 item.write(savedFile);
就是往磁盘上写文件时出错的;
下图这个是远程连接Linux的工具;
四 后来研究了下资料,这个是权限引起的;本身tomcat用root启动,可以对任何目录读写;但Java程序有个限制,Java程序默认只对Java程序自身所在目录有写的权限,对别的目录写文件要在代码里设置一下;
File savedFile = new File(uploadPath, name);
savedFile.setWritable(true,false);
item.write(savedFile);
中间这句就是设置可写权限的;加了这句就可上传了;
五 远程重启Linux服务器上的tomcat服务,用putty工具,按下图进行;
最近火气重,解决完问题中午出去吃饭顺便买盒六味地黄丸,吃一颗,降降火;