准備工作:需要使用coomos-net jar包。下載地址
一、 上傳圖片到FTP,文件大小為0的問題,解決:將ftp模式修改為Passive模式就可以了。
//將ftp模式修改為Passive模式 ftpClient.enterLocalPassiveMode();
二、配置文件的操作,具體介紹請看 Java中Properties類的用法總結
1.使用.properties配置文件的形式定義相關常量。
2.在工具類中導入配置文件

private static Properties getFtpConfig(){ Properties p=new Properties(); String path=Thread.currentThread().getContextClassLoader().getResource("ftpConfig.properties").getPath(); try { p.load(new FileInputStream(path)); // System.out.println(p.getProperty("ftpUsername")); // System.out.println(p.getProperty("ftpPassword")); // System.out.println(p.getProperty("ftpServerIP")); // System.out.println(p.getProperty("basePath")); } catch (Exception e) { e.printStackTrace(); } return p; }
3.調用該方法,這樣就取到了配置文件里對應的數據。
private static String ftpUsername = getFtpConfig().getProperty("ftpUsername"); private static String ftpPassword =getFtpConfig().getProperty("ftpPassword"); private static String ftpServerIP=getFtpConfig().getProperty("ftpServerIP"); private static String basePath = getFtpConfig().getProperty("basePath");// 文件路徑
三、下面開始講上傳ftp具體的操作
1.將前台傳回的base64編碼,進行拆分。 解碼之前得去掉"data:image/jpeg;base64,"。
String ftpImgSrc=""; if (!("".equals(base64ImgsString)) && base64ImgsString !=null) { SimpleDateFormat dateFormatImg = new SimpleDateFormat("yyyyMMddHHmmss"); List<Object> imgBase64List = JSON.parseArray(base64ImgsString); for (Object object : imgBase64List) { String[] imgBaseArray = object.toString().split(","); String base64Head = imgBaseArray[0]; //圖片后綴 String imgSuffix = base64Head.substring(base64Head.indexOf("/")+1, base64Head.indexOf(";")); //去掉base64編碼字符串的前綴 String imgStr=imgBaseArray[1]; //重命名圖片文件,日期加工號 String newImgName = dateFormatImg.format(new Date()) +"_"+zjmWorkNumber+"."+imgSuffix; //向FTP服務器上傳文件 ,返回路徑 ftpImgSrc = FtpUtil.uploadFile("CZBG",newImgName,imgStr); }
}
2.上傳文件方法,參數為項目名,圖片名稱,圖片加密后的字符串。
我的文件路徑是ftp:/ftpIP//picture/大項目名/子項目名/yyyyMMdd/yyyyMMddHHmmss_xxx.jpg

/** * 向FTP服務器上傳文件 * @author Administrator * 2019年12月25日 下午1:45:34 * @param projectName 項目名 * @param imgName 文件名 * @param imgStr 圖片碼 * @return 成功返回true,否則返回false * @throws FileNotFoundException */ public static String uploadFile(String projectName,String imgName,String imgStr) throws FileNotFoundException { String result = ""; FTPClient ftpClient = new FTPClient(); String dfFolder = new SimpleDateFormat("yyyyMMdd").format(new Date());//分日期存放:20191225 //FTP服務器文件存放路徑。 String basePathProject = basePath +"/"+ projectName; try { int reply; // 連接FTP服務器,用默認端口直接連接FTP服務器 ftpClient.connect(ftpServerIP); // 登錄 ftpClient.login(ftpUsername, ftpPassword); reply = ftpClient.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { ftpClient.disconnect(); System.out.println("連接ftp失敗!"); return result; } //將ftp模式修改為Passive模式 ftpClient.enterLocalPassiveMode(); //新建相關的項目文件 ftpClient.makeDirectory(basePathProject); //切換到對應項目文件夾下 ftpClient.changeWorkingDirectory(basePathProject); //創建當前日期文件夾 ftpClient.makeDirectory(dfFolder); //切換到上傳目錄 ftpClient.changeWorkingDirectory(dfFolder); String filePath ="ftp:/"+ftpServerIP+basePathProject+"/"+dfFolder+"/"+imgName; //上傳圖片 if (imgStr == null) //圖像數據為空 return result; BASE64Decoder decoder = new BASE64Decoder(); try{ //Base64解碼 byte[] b = decoder.decodeBuffer(imgStr); for(int i=0;i<b.length;++i){ if(b[i]<0){//調整異常數據 b[i]+=256; } } // //設置上傳文件的類型為二進制類型 ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE); InputStream is = null; is = new ByteArrayInputStream(b); ftpClient.storeFile(new String(imgName.getBytes("utf-8"), "iso-8859-1"), is); is.close(); //退出 ftpClient.logout(); result = filePath;//返回存的ftp路徑 }catch (Exception e){ e.printStackTrace(); return result; } } catch (IOException e) { e.printStackTrace(); } finally { if (ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException ioe) { } } } return result; }
成功上傳
問題:表單提交時因為圖片太大,Ajax發送請求,后台接收都為null。
解決:修改tomcat maxPostSize="-1" 使post內容大小不限制
tomcat7.0.63之前的版本
maxPostSize 設置為 0 或者負數
Connector 節點中加入maxPostSize="0" 或者 maxPostSize="-1"
tomcat7.0.63之后的版本,需要設置為負數
Connector 節點中加入 maxPostSize="-1"