2013-02-26 162 views
1

我已經開發了我的Android應用會記錄用戶每10分鐘的GPS位置和時間,並將其保存爲.txt文件。 現在我需要將此文件發送到服務器。我現在正在用FTP做這件事,但這似乎並不正確,因爲我計劃將其擴展到大約10,000個用戶或更多,所以FTP方法看起來不太好。 我還可以使用其他方式將文件發送到服務器?我需要這是相對安全的。 感謝您的時間發送文件到服務器的android

編輯:所有的答案看起來非常好,但據我所知,唯一的解決方案,提供安全的連接,並只允許客戶端爲什麼密碼是FTP。 是否可以發出Web請求並只接受使用正確密碼的客戶端?

+1

你可能硬編碼在應用程序中的密碼,這是不是真的安全。如果你想要一個更安全的解決方案,以確保你只從真正安裝你的應用的用戶那裏獲取數據:http://android-developers.blogspot.com/2013/01/verifying-back-end-calls-from-android .html – satur9nine 2013-02-26 02:45:50

回答

0

我知道它不回答你的問題,或者至少暗示之一,但你有沒有考慮過使用批處理的HTTP請求?

這是谷歌Analytics(分析)是如何工作的,它記錄了幾個事件(在你的情況下的位置數據),然後定期發送了一批服務器。

這將比使用文件來得容易很多。

如果你想agressively保存用戶的電池續航時間,你也可以看看發送請求,只有當別人開始了網絡。 Reto Meier在這方面有很棒的Google I/O 2012會議。

+0

檢查我的編輯,你的答案看起來非常好,但我需要一些額外的信息 – 2013-02-26 02:07:22

0

你可以嘗試在SFTP方式通過使用意圖andFTP,看他們如何使用該應用程序爲目的的常見問題。

0

這樣做的一種方式是讓客戶端調用遠程服務器上的Web服務,發送包含請求的數據(通常使用JSON,但實際上可以是任何內容)。然後,Web服務將獲取這些數據,處理該數據並將響應發送回客戶端。答案將成功或失敗,或者你想要。

0

我發現下面的代碼(從Funf大多采取)可以很好地用於此目的:

public static boolean uploadFile(File file, String uploadurl) { 
    HttpURLConnection conn = null; 
    DataOutputStream dos = null; 
    String lineEnd = "\r\n"; 
    String twoHyphens = "--"; 
    String boundary = "*****"; 
    int bytesRead, bytesAvailable, bufferSize; 
    byte[] buffer; 
    int maxBufferSize = 64 * 1024; 
    FileInputStream fileInputStream = null; 
    boolean isSuccess = true; 
    try { 
     // ------------------ CLIENT REQUEST 
     try { 
      fileInputStream = new FileInputStream(file); 
     } catch (FileNotFoundException e) {} 
     URL url = new URL(uploadurl); 
     conn = (HttpURLConnection) url.openConnection(); 
     conn.setDoInput(true); 
     conn.setDoOutput(true); 
     conn.setUseCaches(false); 
     conn.setConnectTimeout(60000); 
     conn.setReadTimeout(60000); 
     conn.setRequestMethod("POST"); 
     conn.setRequestProperty("Connection", "Keep-Alive"); 
     conn.setRequestProperty("Content-Type", 
      "multipart/form-data;boundary=" + boundary); 
     dos = new DataOutputStream(conn.getOutputStream()); 
     dos.writeBytes(twoHyphens + boundary + lineEnd); 
     dos.writeBytes("Content-Disposition: form-data; " 
      + "name=\"uploadedfile\";filename=\"" 
      + file.getName() + "\"" + lineEnd); 
     dos.writeBytes(lineEnd); 
     bytesAvailable = fileInputStream.available(); 
     bufferSize = Math.min(bytesAvailable, maxBufferSize); 
     buffer = new byte[bufferSize]; 
     bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
     while (bytesRead > 0) { 
      dos.write(buffer, 0, bufferSize); 
      bytesAvailable = fileInputStream.available(); 
      bufferSize = Math.min(bytesAvailable, maxBufferSize); 
      bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
     } 
     dos.writeBytes(lineEnd); 
     dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 
    } catch (Exception e) { 
     isSuccess = false; 
    } finally { 
     if (dos != null) { 
      try { 
       dos.close(); 
      } catch (IOException e) { 
       // do something 
      } 
     } 
     if (fileInputStream != null) { 
      try { 
       fileInputStream.close(); 
      } catch (IOException e) { 
       // do something 
      } 
     } 
    } 
    // ------------------ read the SERVER RESPONSE 
    try { 
     if (conn.getResponseCode() != 200) { 
      isSuccess = false; 
     } 
    } catch (IOException e) { 
     isSuccess = false; 
    } 
    return isSuccess; 
} 
+0

代碼看起來非常好,但我怎樣才能實現這與一些服務器安全?你知不知道怎麼? – 2013-02-26 02:13:40