1

ユーザーのGPS位置と時刻を10分ごとに記録し、それを.txtファイルに保存するAndroidアプリをすでに開発しました。次に、このファイルをサーバーに送信する必要があります。私は現在FTPでそれを行っていますが、これを約10.000ユーザー以上に拡張することを計画しているため、FTPアプローチは適切ではないように思われるため、正しくないようです。ファイルをサーバーに送信するために他にどのような方法を使用できますか?これは比較的安全である必要があります。御時間ありがとうございます

編集:すべての答えは私には非常によく見えますが、私が知る限り、安全な接続を提供し、パスワードがFTPである理由をクライアントのみに許可する唯一のソリューションです。Webリクエストを作成し、正しいパスワードを持つクライアントのみを受け入れることは可能ですか?

4

4 に答える 4

0

私はそれがあなたの質問または少なくとも暗黙の質問に答えないことを知っていますが、バッチ化されたHTTPリクエストの使用を検討しましたか?

これがGoogleAnalyticsの仕組みであり、いくつかのイベント(この場合は位置データ)を記録してから、定期的にサーバーにバッチを送信します。

これは、ファイルをいじるよりもはるかに簡単です。

ユーザーのバッテリー寿命を積極的に節約したい場合は、他の誰かがネットワークを起動したときにのみリクエストを送信することも検討できます。これについては、RetoMeierによるすばらしいGoogleI /O2012セッションがあります。

于 2013-02-26T01:18:17.697 に答える
0

これを行う1つの方法は、クライアントにリモートサーバー上のWebサービスを呼び出して、要求とともにデータを送信することです(通常はJSONですが、実際には何でもかまいません)。次に、Webサービスはこのデータを取得して処理し、クライアントに応答を送り返します。応答は、成功または失敗のいずれか、または必要に応じて行われます。

于 2013-02-26T01:29:30.617 に答える
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;
}
于 2013-02-26T01:55:02.890 に答える
0

sftpモードでインテントを介してandFTPを使用することができます。そのアプリをインテントとして使用する方法については、FAQを参照してください。

于 2013-02-26T01:12:57.243 に答える