解决Java Web对Linux服务器不能上传文件的难题

一 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 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选项卡,在源代码中下断点,在这里下断点调试,没发现什么可用信息;

解决Java Web对Linux服务器不能上传文件的难题_第1张图片



三 然后看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的工具;

解决Java Web对Linux服务器不能上传文件的难题_第2张图片


四 后来研究了下资料,这个是权限引起的;本身tomcat用root启动,可以对任何目录读写;但Java程序有个限制,Java程序默认只对Java程序自身所在目录有写的权限,对别的目录写文件要在代码里设置一下;
File savedFile = new File(uploadPath, name);
savedFile.setWritable(true,false);
item.write(savedFile);
中间这句就是设置可写权限的;加了这句就可上传了;

五 远程重启Linux服务器上的tomcat服务,用putty工具,按下图进行;
解决Java Web对Linux服务器不能上传文件的难题_第3张图片


最近火气重,解决完问题中午出去吃饭顺便买盒六味地黄丸,吃一颗,降降火;

你可能感兴趣的:(原创教程,Java)