解决Java Web对Linux服务器不能上传文件的难题
一 Java Web文件上傳程序
? ? 頁(yè)面中用html或某個(gè)js框架,彈出選擇上傳文件界面,用戶(hù)選擇文件后上傳;傳到服務(wù)器上調(diào)用servlet進(jìn)行處理,把接受到的內(nèi)容寫(xiě)入服務(wù)器相應(yīng)目錄。Java Web上傳都是這個(gè)思路,網(wǎng)上有很多例子,就不再多說(shuō)了。
? ? 本項(xiàng)目的servlet主體代碼如下: ? ? ? ? ? ? ? ?
//上傳文件實(shí)際保存路徑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));//設(shè)置臨時(shí)目錄ServletFileUpload upload = new ServletFileUpload(factory);upload.setHeaderEncoding("UTF-8");upload.setSizeMax(1024 * 1024 * 1024);//設(shè)置文件大小List<FileItem> items = upload.parseRequest(request);for (FileItem item : items) {if (!item.isFormField()) {// 如果是文件類(lèi)型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();}如果服務(wù)器為Windows,一切正常;服務(wù)器為L(zhǎng)inux則上傳失敗;
初認(rèn)為是路徑問(wèn)題,因?yàn)閃indows和Linux的路徑寫(xiě)法不同;不過(guò)對(duì)于Linux,下面兩種寫(xiě)法,一種是從上下文獲取路徑,一種直接寫(xiě)絕對(duì)路徑,都不能上傳;
uploadPath=request.getSession().getServletContext().getRealPath("/dddd");//uploadPath="/var/lib/tomcat6/webapps/xxxx/dddd/";二 用js調(diào)試控制臺(tái),在chrome下打F12,調(diào)出js調(diào)試控制臺(tái),找到要調(diào)試的js或jsp,切到sources選項(xiàng)卡,在源代碼中下斷點(diǎn),在這里下斷點(diǎn)調(diào)試,沒(méi)發(fā)現(xiàn)什么可用信息;
三 然后看tomcat控制臺(tái)輸出信息,這個(gè)在Linux下不像Windows下有個(gè)控制臺(tái)的面板可看;在linux下進(jìn)入tomcat的logs目錄,打命令tail?-f?catalina.out可看到tomcat控制臺(tái)的輸出;
這個(gè)查看會(huì)自己刷新,如果要退出查看,打Ctrl+C,返回到linux命令行界面;
通過(guò)這個(gè)圖可以看到錯(cuò)誤代碼在AddPicOtherServlet.java的57行;
56?File?savedFile?=?new?File(uploadPath,?name);
57?item.write(savedFile);
就是往磁盤(pán)上寫(xiě)文件時(shí)出錯(cuò)的; 下圖這個(gè)是遠(yuǎn)程連接Linux的工具;
四 后來(lái)研究了下資料,這個(gè)是權(quán)限引起的;本身tomcat用root啟動(dòng),可以對(duì)任何目錄讀寫(xiě);但Java程序有個(gè)限制,Java程序默認(rèn)只對(duì)Java程序自身所在目錄有寫(xiě)的權(quán)限,對(duì)別的目錄寫(xiě)文件要在代碼里設(shè)置一下;
File?savedFile?=?new?File(uploadPath,?name);
savedFile.setWritable(true,false);
item.write(savedFile);
中間這句就是設(shè)置可寫(xiě)權(quán)限的;加了這句就可上傳了;
五 遠(yuǎn)程重啟Linux服務(wù)器上的tomcat服務(wù),用putty工具,按下圖進(jìn)行;
最近火氣重,解決完問(wèn)題中午出去吃飯順便買(mǎi)盒六味地黃丸,吃一顆,降降火;
總結(jié)
以上是生活随笔為你收集整理的解决Java Web对Linux服务器不能上传文件的难题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: HTTP状态码和编程
- 下一篇: 图解Windows下使用SSH Secu