Android 将文件从SD卡上载到FileZilla服务器
我的应用程序正在将文件从SD卡上载到FileZilla FTP服务器上的目录。在运行我的应用程序后,它给了我一个异常,我在多次搜索后无法解决该异常 以下是日志cat输出:Android 将文件从SD卡上载到FileZilla服务器,android,android-asynctask,filezilla,ftp-server,Android,Android Asynctask,Filezilla,Ftp Server,我的应用程序正在将文件从SD卡上载到FileZilla FTP服务器上的目录。在运行我的应用程序后,它给了我一个异常,我在多次搜索后无法解决该异常 以下是日志cat输出: 06-24 11:06:53.715: W/System.err(1304): java.io.IOException: SimpleFTP received an unknown response when connecting to the FTP server: 220-FileZilla Server version
06-24 11:06:53.715: W/System.err(1304): java.io.IOException: SimpleFTP received an unknown response when connecting to the FTP server: 220-FileZilla Server version 0.9.41 beta
06-24 11:06:54.055: W/System.err(1304): at org.jibble.simpleftp.SimpleFTP.connect(SimpleFTP.java:74)
06-24 11:06:54.087: W/System.err(1304): at com.example.upload1.MainActivity$UploadVideo.doInBackground(MainActivity.java:63)
06-24 11:06:54.167: W/System.err(1304): at com.example.upload1.MainActivity$UploadVideo.doInBackground(MainActivity.java:1)
06-24 11:06:54.167: W/System.err(1304): at android.os.AsyncTask$2.call(AsyncTask.java:287)
06-24 11:06:54.167: W/System.err(1304): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
06-24 11:06:54.167: W/System.err(1304): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
06-24 11:06:54.167: W/System.err(1304): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
06-24 11:06:54.167: W/System.err(1304): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
06-24 11:06:54.403: W/System.err(1304): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
06-24 11:06:54.403: W/System.err(1304): at java.lang.Thread.run(Thread.java:856)
这是我的MainActivity.java代码
import java.io.File;
import org.jibble.simpleftp.SimpleFTP;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
//import com.kpbird.ftpdemo.R;
public class MainActivity extends Activity implements OnClickListener {
//FTPClient client;
/********* work only for Dedicated IP ***********/
static final String FTP_HOST= "203.199.134.131";
/********* FTP USERNAME ***********/
static final String FTP_USER = "a_gupta";
/********* FTP PASSWORD ***********/
static final String FTP_PASS ="AditI123";
Button btn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener(this);
}
public void onClick(View v) {
UploadFile async = new UploadFile();
async.execute();
}
class UploadFile extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... params) {
// ftpClient=uploadingFilestoFtp();
try {
SimpleFTP ftp = new SimpleFTP();
ftp.connect(FTP_HOST, 21, FTP_USER, FTP_PASS);
ftp.bin();
// Change to a new working directory on the FTP server.
ftp.cwd("callrecording");
// Upload some files.
ftp.stor(new File(Environment.getExternalStorageDirectory().getParent() + "/invite_json.txt"));
// ftp.stor(new File("comicbot-latest.png"));
// You can also upload from an InputStream, e.g.
// ftp.stor(new FileInputStream(new File("test.png")),
// "test.png");
// ftp.stor(someSocket.getInputStream(), "blah.dat");
// Quit from the FTP server.
ftp.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
// dialog.show();
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
Toast.makeText(MainActivity.this, "sent", Toast.LENGTH_LONG).show();
}
}
导入java.io.File;
导入org.jibble.simpleftp.simpleftp;
导入android.app.Activity;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.os.Environment;
导入android.view.view;
导入android.view.view.OnClickListener;
导入android.widget.Button;
导入android.widget.Toast;
//导入com.kpbird.ftpdemo.R;
公共类MainActivity扩展活动实现OnClickListener{
//FTP客户机;
/*********仅适用于专用IP***********/
静态最终字符串FTP_HOST=“203.199.134.131”;
/*********FTP用户名***********/
静态最终字符串FTP\u USER=“a\u gupta”;
/*********FTP密码***********/
静态最终字符串FTP_PASS=“AditI123”;
按钮btn;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=(按钮)findViewById(R.id.button1);
btn.setOnClickListener(此);
}
公共void onClick(视图v){
UploadFile async=新建UploadFile();
execute();
}
类UploadFile扩展异步任务{
@凌驾
受保护的字符串doInBackground(字符串…参数){
//ftpClient=uploadingFilestoFtp();
试一试{
SimpleFTP ftp=新的SimpleFTP();
连接(ftp_主机,21,ftp_用户,ftp_通行证);
ftp.bin();
//更改为FTP服务器上的新工作目录。
ftp.cwd(“通话记录”);
//上传一些文件。
stor(新文件(Environment.getExternalStorageDirectory().getParent()+“/invite_json.txt”);
//stor(新文件(“comicbot latest.png”);
//您也可以从InputStream上传,例如。
//stor(新文件输入流(新文件(“test.png”)),
//“test.png”);
//stor(someSocket.getInputStream(),“blah.dat”);
//从FTP服务器退出。
ftp.disconnect();
}捕获(例外e){
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
//dialog.show();
}
@凌驾
受保护的void onPostExecute(字符串结果){
//TODO自动生成的方法存根
super.onPostExecute(结果);
Toast.makeText(MainActivity.this,“sent”,Toast.LENGTH_LONG.show();
}
}
SimpleFTP库实现似乎不符合FTP规范()。根据找到的来源,它期望FTP服务器的初始回复以“220”
开头,而RFC指定[a]FTP回复由三位数字组成(以三个字母数字字符传输)然后是一些文本。因此允许以“220-”
开头的回复
我建议使用一个更好的FTP库,如或。经过这么多天的工作,我又一次做了这个东西,并且成功地让它工作起来。因此,我发布了我的答案。希望它能对一些人有所帮助 这是我的主要活动代码:
package com.example.ftpup;
import it.sauronsoftware.ftp4j.FTPAbortedException;
import it.sauronsoftware.ftp4j.FTPClient;
import it.sauronsoftware.ftp4j.FTPDataTransferException;
import it.sauronsoftware.ftp4j.FTPDataTransferListener;
import it.sauronsoftware.ftp4j.FTPException;
import it.sauronsoftware.ftp4j.FTPIllegalReplyException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
/********* work only for Dedicated IP ***********/
static final String FTP_HOST= "203.199.134.131";
/********* FTP USERNAME ***********/
static final String FTP_USER = "a_gupta";
/********* FTP PASSWORD ***********/
static final String FTP_PASS ="AditI123";
public static final int DIALOG_DOWNLOAD_PROGRESS = 0;
Button btn;
FTPClient client = new FTPClient();
private ProgressDialog mProgressDialog;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.uploadButton);
btn.setOnClickListener(this);
}
public void onClick(View v) {
startDownload();
}
// /******* Used to file upload and show progress **********/
private void startDownload() {
//Pick file
//File f = new File("/sdcard/invite_json.txt");
// Async task
new DownloadFileAsync().execute();
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DIALOG_DOWNLOAD_PROGRESS:
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setMessage("Downloading file..");
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.setCancelable(false);
mProgressDialog.show();
return mProgressDialog;
default:
return null;
}
}
// Upload sdcard file
//public void uploadFile(File fileName){
class DownloadFileAsync extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
showDialog(DIALOG_DOWNLOAD_PROGRESS);
}@Override
protected String doInBackground(String... filename) {
String sdcard = Environment.getExternalStorageDirectory().toString();
File file = new File(sdcard+"/androrec/");
//File file2 = new File("/mnt/sdcard/CallRecorderBackup");
File[] listofFiles = file.listFiles();
Log.d("No. of files" ,fileArrayToString(listofFiles));
try{
client.connect(FTP_HOST,21);
for (int i = 0; i <=listofFiles.length ; i++) {
Log.d("Tag 4", "inside of ftp connect");
Log.d("Tag 1", "inside of for loop");
if (listofFiles == null || listofFiles[i].isFile()) {
Log.d("Tag 2", "inside of if");
String files = listofFiles[i].getName();
Log.d("Tag 3", "inside of files");
File filetoload = new File(sdcard+"/androrec/"+files);
String uploadingFiles = filetoload.toString();
Log.d("Files uploading to the server", uploadingFiles);
client.login(FTP_USER, FTP_PASS);
//client.connect(FTP_HOST,21);
Log.d("Tag 4", "inside of ftp connect");
Log.d("Tag 5", "inside of for ftp pass");
//client.setType(FTPClient.TYPE_BINARY);
//client.changeDirectory("/");
Log.d("Tag 6", "inside of for dir");
client.upload(filetoload);
Log.d("Tag 7", "inside of download");
//out.write(buf, 0, len);
//}
//}
// client.upload(in, new MyTransferListener());
}
else{
}
//client.disconnect(true);
}
}
catch (IllegalStateException | IOException
| FTPIllegalReplyException | FTPException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FTPDataTransferException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FTPAbortedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
client.disconnect(true);
} catch (Exception e2) {
e2.printStackTrace();
}
return null;
}
/*}
}*/
@Override
protected void onPostExecute(String unused) {
dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
}
}
// }
String fileArrayToString(File[] f){
String output = "";
String delimiter = "\n" ;// Can be new line \n tab \t etc...
for (int i=0; i<f.length; i++)
{
output = output + f[i].getPath() + delimiter;
}
return output;
}
}
package com.example.ftpup;
导入it.sauronsoftware.ftp4j.ftpBartedException;
导入it.sauronsoftware.ftp4j.FTPClient;
导入it.sauronsoftware.ftp4j.FTPDataTransferException;
导入it.sauronsoftware.ftp4j.FTPDataTransferListener;
导入it.sauronsoftware.ftp4j.FTPException;
导入it.sauronsoftware.ftp4j.FTPIllegalReplyException;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileNotFoundException;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.OutputStream;
导入android.app.Activity;
导入android.app.Dialog;
导入android.app.ProgressDialog;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.os.Environment;
导入android.util.Log;
导入android.view.view;
导入android.view.view.OnClickListener;
导入android.widget.Button;
导入android.widget.Toast;
公共类MainActivity扩展活动实现OnClickListener{
/*********仅适用于专用IP***********/
静态最终字符串FTP_HOST=“203.199.134.131”;
/*********FTP用户名***********/
静态最终字符串FTP\u USER=“a\u gupta”;
/*********FTP密码***********/
静态最终字符串FTP_PASS=“AditI123”;
公共静态最终整型对话框\u下载\u进度=0;
按钮btn;
FTPClient client=新的FTPClient();
private ProgressDialog mProgressDialog;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=(按钮)findViewById(R.id.uploadButton);
btn.setOnClickListener(此);
}
公共void onClick(视图v){
startDownload();
}
///*******用于文件上传和显示进度**********/
私有void startDownload(){
//拾取文件
//文件f=新文件(“/sdcard/invite_json.txt”);
//异步任务
新建DownloadFileAsync().execute();
}
@凌驾
受保护的对话框onCreateDialog(int id){
开关(id){
案例对话框\u下载\u进度:
mProgressDialog=新建进度对话框(此);
设置消息(“下载文件…”);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_水平);
mProgressDialog.setCancelable(假);
mProgressDialog.show();
返回mProgressDialog;
违约: