Java上傳圖片到Ftp,包含上傳后文件大小為0的問題和Properties配置文件的讀取


准備工作:需要使用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;
      }
Properties

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;
    }
FTP上傳方法

成功上傳

 

 問題:表單提交時因為圖片太大,Ajax發送請求,后台接收都為null。

解決:修改tomcat  maxPostSize="-1" 使post內容大小不限制

tomcat7.0.63之前的版本

maxPostSize 設置為 0 或者負數

Connector 節點中加入maxPostSize="0"  或者  maxPostSize="-1" 

tomcat7.0.63之后的版本,需要設置為負數

Connector 節點中加入 maxPostSize="-1" 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM