Android n00b がファイル サーバーのアップロードを把握しようとしています。storeFile
の方法を使用して Android の FTP サーバーにファイルをアップロードしようFTPClient
として、Galaxy Nexus でテストするのに多くの問題があります。2 つの問題。まず、非常にゆっくりと実行されます-コードが移動する前に、数バイトのファイルの場合、1分以上かかります(実行が完了する前にディスプレイがスリープ状態になることがよくあります)。第 2 に、完了時にサーバーにファイルが到着しません。しかし、コードは引き続き実行され、私が知る限り、何かが間違っていることを示す明示的なエラー メッセージは表示されません。しかし 3 番目に、すべて (およびログアウト) の後、NullPointerExceptionが発生し、アクティビティが中止されます。
(また、NetworkInfo.getActiveNetworkInfo()
接続していないときでも常に CONNECTED を返すように見える 4 つ目の問題ですが、それは無関係のようで、より大きな問題に焦点を当てたいと思います。)
これが私のコードです: [Reuse.logIt
は、logcat に出力してディスプレイに表示するために使用する方法printToUI
ですsetText
。おそらくお分かりのように、私は何が起こっているのかを理解するために多くの道しるべを自分自身に与えようとしています.]
public void uploadFile(String filename, File theFile)
{
Reuse.logIt(TAG, "UploadFile did run."); // test that at least
FTPClient theClient = new FTPClient();
// It's probably insecure to do it this way, but first I just want to make it work.
final String theSite = [the name of my site];
String username = [my username];
String password = [my password];
// get network status
Context theContext = getApplicationContext();
ConnectivityManager cMgr = (ConnectivityManager)theContext.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cMgr.getActiveNetworkInfo();
String beginStatus = netInfo.getState().toString();
// always says CONNECTED whether we're connected or not.
String networkStatus = "Network status = "+beginStatus;
Reuse.logIt(TAG, networkStatus);
// pass the network status where it can be displayed in a different window's text.
Brouillon instance = (Brouillon) theContext;
instance.setDataResult(networkStatus);
if (beginStatus == "CONNECTED")
// If we don't have a network connection, don't upload the file.
{
try
{
theClient.connect(theSite);
// When login succeeds, the login method returns true.
boolean login = theClient.login(username, password);
if (login)
{
// success!
Reuse.logIt(TAG, "Logged in successfully to "+theSite+"!");
printToUI("ftp_connect", "Logged in successfully to "+theSite+"!");
Reuse.logIt(TAG, "The code does continue after logging in.");
// Now upload the file.
String ftpPath = "/brouillon/";
String filenameOnFTP = ftpPath+filename;
Reuse.logIt(TAG, "It defined the variables.");
FileInputStream fis = new FileInputStream(theFile);
Reuse.logIt(TAG, "It created the FileInputStream too.");
theClient.storeFile(filenameOnFTP, fis);
Reuse.logIt(TAG, "We created a file called "+filenameOnFTP+".");
printToUI("upload","We created a file called "+filenameOnFTP+".");
}
else
{
Reuse.logIt(TAG, "Could not connect to "+theSite+".");
printToUI("ftp_connect","Could not connect to "+theSite+".");
}
boolean logout = theClient.logout();
if (logout)
{
Reuse.logIt(TAG, "Logged out successfully.");
printToUI("loggedout","Logged out successfully.");
}
else
{
Reuse.logIt(TAG, "Logout failed!");
printToUI("loggedout","Logout failed!");
}
}
catch(IOException e)
{
e.printStackTrace();
Reuse.logIt(TAG, "Got error message "+e.toString()+".");
}
}
else
{
// For testing purposes, abort the program if not connected. Can change that later.
Reuse.logIt(TAG, "beginStatus was not CONNECTED!");
System.exit(0);
}
}
}
そして、これが私のlogcatです。(エラー モードに設定します。より詳細なモードが役立つ場合は、喜んでそれを行いますが、この投稿が非常に長くなるため、最初は省略します。)
03-29 13:08:13.400: E/SyncStatus(8764): Sync button pushed.
03-29 13:08:13.400: E/SyncStatus(8764): File created and closed.
03-29 13:08:13.400: E/SyncStatus(8764): UploadFile did run.
03-29 13:08:13.431: E/SyncStatus(8764): Network status = CONNECTED
03-29 13:08:14.556: E/SyncStatus(8764): Logged in successfully to [site name]!
03-29 13:08:14.556: E/SyncStatus(8764): The code does continue after logging in.
03-29 13:08:14.556: E/SyncStatus(8764): It defined the variables.
03-29 13:08:14.556: E/SyncStatus(8764): It created the FileInputStream too.
03-29 13:10:32.283: E/wpa_supplicant(452): android_priv_cmd: failed to issue private commands
03-29 13:11:28.603: E/SyncStatus(8764): We created a file called /brouillon/filename.txt.
03-29 13:11:28.705: E/SyncStatus(8764): Logged out successfully.
03-29 13:11:28.713: E/AndroidRuntime(8764): FATAL EXCEPTION: main
03-29 13:11:28.713: E/AndroidRuntime(8764): java.lang.NullPointerException
03-29 13:11:28.713: E/AndroidRuntime(8764): at com.loveofallwisdom.brouillon.SyncStatus$2.run(SyncStatus.java:174)
03-29 13:11:28.713: E/AndroidRuntime(8764): at android.os.Handler.handleCallback(Handler.java:725)
03-29 13:11:28.713: E/AndroidRuntime(8764): at android.os.Handler.dispatchMessage(Handler.java:92)
03-29 13:11:28.713: E/AndroidRuntime(8764): at android.os.Looper.loop(Looper.java:137)
03-29 13:11:28.713: E/AndroidRuntime(8764): at android.app.ActivityThread.main(ActivityThread.java:5041)
03-29 13:11:28.713: E/AndroidRuntime(8764): at java.lang.reflect.Method.invokeNative(Native Method)
03-29 13:11:28.713: E/AndroidRuntime(8764): at java.lang.reflect.Method.invoke(Method.java:511)
03-29 13:11:28.713: E/AndroidRuntime(8764): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
03-29 13:11:28.713: E/AndroidRuntime(8764): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
03-29 13:11:28.713: E/AndroidRuntime(8764): at dalvik.system.NativeStart.main(Native Method)
03-29 13:11:38.931: E/wpa_supplicant(452): android_priv_cmd: failed to issue private commands