java,import org.apache.commons.net.ftp.FTP;,import org.apache.commons.net.ftp.FTPClient;,,import java.io.FileInputStream;,import java.io.IOException;,,public class FTPUploader {, public static void uploadFile(String server, int port, String user, String pass, String filePath, String remotePath) {, FTPClient ftpClient = new FTPClient();, try {, ftpClient.connect(server, port);, ftpClient.login(user, pass);, ftpClient.enterLocalPassiveMode();, ftpClient.setFileType(FTP.BINARY_FILE_TYPE);,, FileInputStream inputStream = new FileInputStream(filePath);, boolean done = ftpClient.storeFile(remotePath, inputStream);, inputStream.close();, if (done) {, System.out.println("The file is uploaded successfully.");, } else {, System.out.println("Failed to upload the file.");, }, } catch (IOException ex) {, ex.printStackTrace();, } finally {, try {, if (ftpClient.isConnected()) {, ftpClient.logout();, ftpClient.disconnect();, }, } catch (IOException ex) {, ex.printStackTrace();, }, }, },},
“,,這段代碼展示了如何使用Apache Commons Net庫(kù)連接到FTP服務(wù)器并上傳文件。請(qǐng)確保在使用前添加相應(yīng)的依賴項(xiàng)。 在Android應(yīng)用中實(shí)現(xiàn)將照片傳送到FTP服務(wù)器的功能,需要使用一些網(wǎng)絡(luò)編程和文件操作的知識(shí),以下是詳細(xì)的步驟和代碼示例,幫助你完成這個(gè)任務(wù)。
1. 準(zhǔn)備工作
1 添加權(quán)限
需要在AndroidManifest.xml
文件中添加必要的權(quán)限:
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2 添加依賴庫(kù)
為了簡(jiǎn)化FTP操作,可以使用Apache Commons Net庫(kù),在你的build.gradle
文件中添加以下依賴:
implementation 'commons-net:commons-net:3.8.0'
2. 獲取照片
1 從相冊(cè)選擇照片
可以通過(guò)Intent來(lái)啟動(dòng)系統(tǒng)相冊(cè)并選擇照片:
private static final int PICK_IMAGE = 1; private void selectImage() { Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, PICK_IMAGE); } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == PICK_IMAGE && resultCode == RESULT_OK && data != null) { Uri selectedImage = data.getData(); uploadImageToFtp(selectedImage); } }
3. 上傳照片到FTP服務(wù)器
1 創(chuàng)建FTP客戶端類
創(chuàng)建一個(gè)FTP客戶端類來(lái)處理FTP連接和文件上傳:
import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; public class FtpUploader { private String server; private int port; private String user; private String pass; public FtpUploader(String server, int port, String user, String pass) { this.server = server; this.port = port; this.user = user; this.pass = pass; } public boolean uploadFile(String localFilePath, String remoteFilePath) { FTPClient ftpClient = new FTPClient(); try { ftpClient.connect(server, port); ftpClient.login(user, pass); ftpClient.enterLocalPassiveMode(); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); try (InputStream inputStream = new FileInputStream(localFilePath)) { return ftpClient.storeFile(remoteFilePath, inputStream); } } catch (IOException ex) { ex.printStackTrace(); return false; } finally { try { if (ftpClient.isConnected()) { ftpClient.logout(); ftpClient.disconnect(); } } catch (IOException ex) { ex.printStackTrace(); } } } }
2 上傳圖片到FTP服務(wù)器
在uploadImageToFtp
方法中調(diào)用FTP客戶端類進(jìn)行上傳:
private void uploadImageToFtp(Uri imageUri) { String filePath = getRealPathFromURI(imageUri); // 獲取本地文件路徑的方法見(jiàn)下文 FtpUploader ftpUploader = new FtpUploader("ftp.example.com", 21, "username", "password"); boolean success = ftpUploader.uploadFile(filePath, "/path/on/ftp/server/image.jpg"); if (success) { Toast.makeText(this, "Upload successful!", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "Upload failed!", Toast.LENGTH_SHORT).show(); } }
3 獲取本地文件路徑的方法
由于Android的URI機(jī)制,我們需要一個(gè)方法來(lái)獲取實(shí)際的文件路徑:
private String getRealPathFromURI(Uri contentUri) { String[] proj = {MediaStore.Images.Media.DATA}; CursorLoader loader = new CursorLoader(this, contentUri, proj, null, null, null); Cursor cursor = loader.loadInBackground(); int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); String result = cursor.getString(columnIndex); cursor.close(); return result; }
4. 完整代碼示例
以下是完整的代碼示例,包括所有步驟:
import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.widget.Toast; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx.loader.content.Loader; import androidx.loader.app.LoaderManager; import androidx.loader.content.CursorLoader; import androidx." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "." + "</pre>