1. 程式人生 > >利用FTPClient上傳的檔案中中文名字亂碼解決辦法

利用FTPClient上傳的檔案中中文名字亂碼解決辦法

新增下面這一段:

if (FTPReply.isPositiveCompletion(ftpClient.sendCommand(

"OPTS UTF8", "ON"))) {
// 開啟伺服器對UTF-8的支援,如果伺服器支援就用UTF-8編碼,否則就使用本地編碼(GBK).
charSet = "UTF-8";
}

ftpClient.setControlEncoding(charSet);

	public static boolean upload(String ip, String userName, String passWord,
			int port, String charSet, String sourceFileUrl, String ftpGoalDir,
			ArrayList<String> fileNameList) throws Exception {
		// 上傳不成功
		boolean res = false;
		// 建立一個連線FTP伺服器物件
		FTPClient ftpClient = new FTPClient();
		// 建立一個檔案寫入流物件
		FileInputStream fis = null;
		try {
			// 連線FTP伺服器
			ftpClient.connect(ip, port);
			// 登入FTP連線
			ftpClient.login(userName, passWord);
			// 在ftp上建立同名資料夾
			if (sourceFileUrl.substring(
					sourceFileUrl.lastIndexOf(File.separator) + 1).length() > 0) {
				ftpGoalDir = ftpGoalDir
						+ File.separator
						+ sourceFileUrl.substring(sourceFileUrl
								.lastIndexOf(File.separator) + 1);
			}

			if (!isDirExist(ftpClient, ftpGoalDir)) {
				boolean ff = makeDir(charSet, ftpClient, ftpGoalDir);
				if (ff == false) {
					throw new Exception("建立資料夾" + ftpGoalDir + "出錯!");
				}
			}
			for (int i = 0; i < fileNameList.size(); i++) {
				// 建立檔案物件
				File srcFile = new File(sourceFileUrl + File.separator
						+ fileNameList.get(i));
				// 向FTP伺服器寫入檔案
				fis = new FileInputStream(srcFile);
				if (i == 0) {
					// 設定上傳目錄
					boolean flag = ftpClient.changeWorkingDirectory(new String(
							ftpGoalDir.getBytes(charSet), "ISO-8859-1"));
					System.out.println(flag);
				}
				// 向目標伺服器寫入檔案大小限制
				ftpClient.setBufferSize(1024 * 1024);
				//
				// 設定檔案型別(二進位制)
				ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
				if (FTPReply.isPositiveCompletion(ftpClient.sendCommand(
						"OPTS UTF8", "ON"))) {
					// 開啟伺服器對UTF-8的支援,如果伺服器支援就用UTF-8編碼,否則就使用本地編碼(GBK).
					charSet = "UTF-8";
				}
				ftpClient.setControlEncoding(charSet);

				boolean flag = ftpClient.storeFile(
						new String(fileNameList.get(i).getBytes(charSet),
								"ISO-8859-1"), fis);
				System.out.println(flag);
				res = true;
				fis.close();
			}
			System.out.println("upload successful!");
		} catch (IOException e) {
			throw new RuntimeException("FTP客戶端出錯!", e);
		} finally {
			try {
				ftpClient.disconnect();
			} catch (IOException e) {
				throw new RuntimeException("關閉FTP連線發生異常!", e);
			}
		}
		return res;
	}