基於ftpClient的圖片上傳 下載 刪除 展示(包括Base64碼的實現方式)。

這裏主要是講的後臺,所以前臺就簡單描述一下不給代碼了~~~

上傳:前臺可以用form表單提交的方式提交圖片。

展示下載:方法1:可以通過img組件的src訪問後臺,後臺返回一個OutputStream,瀏覽器會自動顯示爲圖片。至於下載嘛~~你懂得~~~;方法2:通過將圖片轉換爲Base64碼 直接返回個前臺(看得見)。

刪除:後臺需要得到圖片的路徑和文件名就OK了,方法不限

後臺代碼:

上傳:



public void upload(File file, String fileName,String dir){   //文件 上傳後的文件名 上傳後的路徑
    FTPClient ftpClient = new FTPClient();
    //與ftp服務器建立連接
    try {
	    ftpClient.setControlEncoding(Constant.FTP_ENCODING); // 中文支持
	    ftpClient.connect(ftpHost);   //ftp服務器地址
	    ftpClient.login(ftpUserName, ftpPassword);   //賬號密碼
	    ftpClient.setDefaultPort(ftpPort);   //端口
	    ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);  //使用二進制保存方式
	    ftpClient.enterLocalPassiveMode(); // 用被動模式傳輸
	    ftpClient.setDefaultTimeout(defaultTimeout);// 設置默認超時時間
	    ftpClient.setBufferSize(1024 * 1024 * 10);  // 設置緩存區

        //支持多級目錄 沒有則創建
        if(!"".equals(dir))
            {
                String[] listD=dir.split("/");
                for(String a:listD){ 
                boolean chagenDirFlag=ftpClient.changeWorkingDirectory(a);  //尋找目錄
                if(chagenDirFlag==false){
                    boolean makeFlag= ftpClient.makeDirectory(a);
                    LogUtil.getAppLoger().info("創建文件目錄標誌:"+makeFlag);
                    chagenDirFlag=ftpClient.changeWorkingDirectory(a);
                }
            }
        }
        input = new FileInputStream(file);
        up = ftpClient.storeFile(fileName, input);
        System.out.println("上傳文件返回標誌:" + up + "上傳目錄" + dir + "文件名稱" + fileName);
        ftpClient.disconnect();
    }catch(Exception e){
        e.printStackTrace();
        ftpClient.disconnect();
    }
}

刪除:

public boolean del(String fileName,String dir) {
		FTPClient ftpClient = new FTPClient();
		try {
			ftpClient.connect(ip, port);
			ftpClient.login(loginName, pwd);
			ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
			int reply = ftpClient.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftpClient.disconnect();
			}
			ftpClient.changeWorkingDirectory(dir);
			// 刪除
			ftpClient.sendCommand("dele " + fileName + "\r\n");
		} catch (SocketException e) {
			e.printStackTrace();
			return false;
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		} finally {
			try {
				ftpClient.disconnect();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return true;
	}

下載展示 方法一:OutputStream的方式

public boolean download(String fileName,String dir) {
		OutputStream outputStream = ServletActionContext.getResponse.getOutputStream();
		boolean flag=false;
		try {
			int reply;
			FTPClient ftp = new FTPClient(); 
			ftp.setControlEncoding("UTF-8"); // 中文支持  
			ftp.connect(ip);  
			ftp.login(loginName, pwd);
			ftp.setDefaultPort(port);  
			ftp.setFileType(FTPClient.BINARY_FILE_TYPE);  
			ftp.enterLocalPassiveMode();  
			ftp.setDefaultTimeout(30000);// 設置默認超時時間  
			ftp.setBufferSize(1024*1024);//設置緩存區,默認緩衝區大小是1024,也就是1K  
			reply = ftp.getReplyCode();    
                        if (!FTPReply.isPositiveCompletion(reply)) {    
                            ftp.disconnect(); 
                        }   
                        flag=ftp.changeWorkingDirectory(dir);//轉移到FTP服務器目錄
                        LogUtil.getAppLoger().info("切換目錄"+flag);
			try {
			    flag=ftp.retrieveFile(fileName, outputStream); 
			    LogUtil.getAppLoger().info("查詢文件"+fileName+"目錄"+dir+"結果"+flag);
			    System.out.println("查詢文件"+fileName+"目錄"+dir+"結果"+flag);
			outputStream.flush();
			outputStream.close();
			} catch (Exception e) {
			    ftp.disconnect(); 
			    e.printStackTrace();
			    return false;
			}
			ftp.disconnect(); 
		} catch (Exception e) {
			return false;
		}
		return true;
	}

下載展示 方法二:將圖片轉爲base64碼返回給前臺,將會是一個超長的string~~

public String download(String path, String fileName) {
		InputStream is = null;
		ByteArrayOutputStream bos = null;
		FTPClient ftpClient = new FTPClient();
		try {
			ftpClient.connect(ip, port);
			ftpClient.login(loginName, pwd);
			ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
			int reply = ftpClient.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftpClient.disconnect();
			}
			path = replaceAll(path);
			changeDirectory(path);
			is = ftpClient.retrieveFileStream(fileName);// 獲取遠程ftp上指定文件的InputStream
			if (null == is) {
				throw new FileNotFoundException(fileName);
			}
			bos = new ByteArrayOutputStream();
			int length;
			byte[] buf = new byte[2048];
			while (-1 != (length = is.read(buf, 0, buf.length))) {
				bos.write(buf, 0, length);
			}
			ByteArrayInputStream fis = new ByteArrayInputStream(
					bos.toByteArray());
			bos.flush();
			is.close();
			bos.close();
			byte[] buffer = new byte[fis.available()]; 
			int offset = 0; 
			int numRead = 0; 
			while (offset < buffer.length && (numRead = fis.read(buffer, offset, buffer.length - offset)) >= 0) {
				offset += numRead;
			}
			if (offset != buffer.length) { 
				throw new IOException("Could not completely read file "); 
			} 
			fis.close(); 
			BASE64Encoder encoder = new BASE64Encoder();
			imgStr = encoder.encode(buffer);
			return imgStr;     //超長的
		} catch (Exception e) {
			AppLogUtil.getAppLoger().error("ftp通過文件名稱獲取遠程文件流", e);
		} finally {
			try {
			    close();
			    is.close();
			    bos.close();
			} catch (Exception e) {
			    e.printStackTrace();
			}
		}
	}

後臺返回base64碼的話,前臺應該這麼寫:

<img src="data:image/jpeg;base64,"+imgStr>     <!--前面的一段爲比寫 imgStr就是後臺返回的base64碼-->

FTPClient和Base64都需要jar包的,自己找吧 多的是~~

注:第一次寫博客 難免會有疏漏 不懂的歡迎來問~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章