Android FTP文件上传
我想将现有文件从Android上传到FTP服务器 下面的代码可以工作,但只在它自己的项目中Android FTP文件上传,android,file,upload,ftp,Android,File,Upload,Ftp,我想将现有文件从Android上传到FTP服务器 下面的代码可以工作,但只在它自己的项目中 public class FtpConnectDemo { public static void main(String[] args) { uploadDatei(SERVER, "SERVER/htdocs/wa/data/ArtikelDatenbank.csv", "ArtikelDatenbank.csv", USER, PASSWORD); } p
public class FtpConnectDemo {
public static void main(String[] args) {
uploadDatei(SERVER, "SERVER/htdocs/wa/data/ArtikelDatenbank.csv", "ArtikelDatenbank.csv", USER, PASSWORD);
}
public static void uploadDatei(String ftpServer, String pfadUndDateiName, String dateiName, String benutzer, String passwort) {
StringBuffer sb = new StringBuffer("ftp://");
sb.append(benutzer);
sb.append(':');
sb.append(passwort);
sb.append('@');
sb.append(ftpServer);
sb.append('/');
sb.append(pfadUndDateiName);
sb.append(";type=a");
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
URL url = new URL(sb.toString());
URLConnection urlc = url.openConnection();
bos = new BufferedOutputStream(urlc.getOutputStream());
bis = new BufferedInputStream(new FileInputStream(dateiName));
int i;
// read byte by byte until end of stream
while ((i = bis.read()) != -1) {
bos.write(i);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
if (bos != null) {
try {
bos.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
}
}
如果我将此代码包含到我的其他项目中,它将不再工作。通过单击按钮调用该方法。onClickListener应该调用第二个方法uploadCsvAufServer()
这是我的另一个项目
调用方法:
private void initObjekte() {
dbHelper = new DBController(this);
this.buttonSync = (Button) this.findViewById(R.id.button_sync);
this.buttonSync.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// 1. Erstellen einer csv-Datei, die die Werte aus 1. enthält: OK
Synchronisierung.this.saveUpdateDateiAufSdCard();
// 2. Kopieren der Datei auf den Webserver
Synchronisierung.this.uploadCsvAufServer();
// Bisher als "nein" gekennzeichnete Werte werden als sychronisiert markiert und auf "ja" gesetzt
Synchronisierung.this.dbHelper.updateSyncStatus();
Synchronisierung.this.getNichtSyncedDaten();
}
});
}
调用的方法:
public void uploadCsvAufServer() {
StringBuffer sb = new StringBuffer("ftp://");
sb.append(this.BENUTZER);
sb.append(':');
sb.append(this.PASSWORT);
sb.append('@');
sb.append(this.SERVER);
sb.append('/');
sb.append(this.SERVER_DATEINAME);
sb.append(";type=a");
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
URL url = new URL(sb.toString());
URLConnection urlc = url.openConnection();
bos = new BufferedOutputStream(urlc.getOutputStream());
bis = new BufferedInputStream(new FileInputStream(this.DATEINAME));
int i;
// read byte by byte until end of stream
while ((i = bis.read()) != -1)
{
bos.write(i);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bis != null) {
try
{
bis.close();
} catch (IOException ioe)
{
ioe.printStackTrace();
}
}
if (bos != null) {
try
{
bos.close();
} catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}
}
日志中的错误请参见以下内容:
08-22 14:03:15.793: E/AndroidRuntime(773): FATAL EXCEPTION: main
08-22 14:03:15.793: E/AndroidRuntime(773): android.os.NetworkOnMainThreadException
08-22 14:03:15.793: E/AndroidRuntime(773): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
08-22 14:03:15.793: E/AndroidRuntime(773): at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
08-22 14:03:15.793: E/AndroidRuntime(773): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
08-22 14:03:15.793: E/AndroidRuntime(773): at java.net.InetAddress.getByName(InetAddress.java:289)
08-22 14:03:15.793: E/AndroidRuntime(773): at java.net.InetSocketAddress.<init>(InetSocketAddress.java:105)
08-22 14:03:15.793: E/AndroidRuntime(773): at java.net.InetSocketAddress.<init>(InetSocketAddress.java:90)
08-22 14:03:15.793: E/AndroidRuntime(773): at libcore.net.url.FtpURLConnection.connectInternal(FtpURLConnection.java:219)
08-22 14:03:15.793: E/AndroidRuntime(773): at libcore.net.url.FtpURLConnection.connect(FtpURLConnection.java:191)
08-22 14:03:15.793: E/AndroidRuntime(773): at libcore.net.url.FtpURLConnection.getOutputStream(FtpURLConnection.java:339)
08-22 14:03:15.793: E/AndroidRuntime(773): at de.noretec.nfcsync.view.Synchronisierung.uploadCsvAufServer(Synchronisierung.java:244)
08-22 14:03:15.793: E/AndroidRuntime(773): at de.noretec.nfcsync.view.Synchronisierung$1.onClick(Synchronisierung.java:95)
08-22 14:03:15.793: E/AndroidRuntime(773): at android.view.View.performClick(View.java:4204)
08-22 14:03:15.793: E/AndroidRuntime(773): at android.view.View$PerformClick.run(View.java:17355)
08-22 14:03:15.793: E/AndroidRuntime(773): at android.os.Handler.handleCallback(Handler.java:725)
08-22 14:03:15.793: E/AndroidRuntime(773): at android.os.Handler.dispatchMessage(Handler.java:92)
08-22 14:03:15.793: E/AndroidRuntime(773): at android.os.Looper.loop(Looper.java:137)
08-22 14:03:15.793: E/AndroidRuntime(773): at android.app.ActivityThread.main(ActivityThread.java:5041)
08-22 14:03:15.793: E/AndroidRuntime(773): at java.lang.reflect.Method.invokeNative(Native Method)
08-22 14:03:15.793: E/AndroidRuntime(773): at java.lang.reflect.Method.invoke(Method.java:511)
08-22 14:03:15.793: E/AndroidRuntime(773): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
08-22 14:03:15.793: E/AndroidRuntime(773): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
08-22 14:03:15.793: E/AndroidRuntime(773): at dalvik.system.NativeStart.main(Native Method)
08-22 14:03:19.773: E/Trace(787): error opening trace file: No such file or directory (2)
要执行异步线程,我想我必须使用
受保护的Void doInBackground(字符串…arg0)方法
这是我的实际代码。我不确定我是否为班长使用了正确的表格:
公共类文件上载扩展异步任务
我没有任何参数,但我可以使用一个
public class FileUpload extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... arg0) {
Server server = new Server();
StringBuffer sb = new StringBuffer("ftp://");
sb.append(server.getBenutzer());
sb.append(':');
sb.append(server.getPasswort());
sb.append('@');
sb.append(server.getFtpServer());
sb.append('/');
sb.append(server.getPfadUndDateiName());
sb.append(";type=a");
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
URL url = new URL(sb.toString());
URLConnection urlc = url.openConnection();
bos = new BufferedOutputStream(urlc.getOutputStream());
bis = new BufferedInputStream(new FileInputStream(server.getDateiName()));
int i;
// read byte by byte until end of stream
while ((i = bis.read()) != -1)
{
bos.write(i);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bis != null) {
try
{
bis.close();
} catch (IOException ioe)
{
ioe.printStackTrace();
}
}
if (bos != null) {
try
{
bos.close();
} catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}
return null;
}
protected void onProgressUpdate(Integer... progress) {
}
protected void onPostExecute(Long result) {
}
}
使用:
public class FTPFileUpload extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... params) {
FTPClient con = new FTPClient();
try {
con.connect(InetAddress.getByName(params[0]));
if (con.login(params[1], params[2])) {
con.enterLocalPassiveMode();
String data = params[3];
ByteArrayInputStream in = new ByteArrayInputStream(data.getBytes());
boolean result = con.storeFile(params[4], in);
in.close();
// if (result)
// System.out.println("upload result: " + result);
}
} catch (Exception e) {
e.printStackTrace();
}
try {
con.logout();
con.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
公共类FTPFileUpload扩展异步任务{
@凌驾
受保护的Void doInBackground(字符串…参数){
FTPClient con=新的FTPClient();
试一试{
con.connect(InetAddress.getByName(参数[0]);
if(con.login(参数[1],参数[2])){
con.enterLocalPassiveMode();
字符串数据=参数[3];
ByteArrayInputStream in=新的ByteArrayInputStream(data.getBytes());
布尔结果=con.storeFile(参数[4],in);
in.close();
//如果(结果)
//System.out.println(“上传结果:+结果”);
}
}捕获(例外e){
e、 printStackTrace();
}
试一试{
con.logout();
con.disconnect();
}捕获(IOE异常){
e、 printStackTrace();
}
返回null;
}
}
尝试使用Apache commons net ftp库
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import org.apache.commons.net.PrintCommandListener;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
public class FTPUploader {
FTPClient ftp = null;
public FTPUploader(String host, String user, String pwd) throws Exception{
ftp = new FTPClient();
ftp.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
int reply;
ftp.connect(host);
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
throw new Exception("Exception in connecting to FTP Server");
}
ftp.login(user, pwd);
ftp.setFileType(FTP.BINARY_FILE_TYPE);
ftp.enterLocalPassiveMode();
}
public void uploadFile(String localFileFullName, String fileName, String hostDir)
throws Exception {
try(InputStream input = new FileInputStream(new File(localFileFullName))){
this.ftp.storeFile(hostDir + fileName, input);
}
}
public void disconnect(){
if (this.ftp.isConnected()) {
try {
this.ftp.logout();
this.ftp.disconnect();
} catch (IOException f) {
// do nothing as file is already saved to server
}
}
}
更新:
尝试从线程或服务中使用您的代码,因为在大于姜饼
的android版本上,操作系统不允许您在Ui主线程上进行网络连接,因此发生了此异常
android.os.NetworkOnMainThreadException
要进一步阅读,请转到此
更新:
试着换一行
sb.append(";type=a");
至
sb.append(";type=i");
08-22 14:03:15.793:E/AndroidRuntime(773):致命异常:主
08-22 14:03:15.793:E/AndroidRuntime(773):android.os.NetworkOnMainThreadException
问题在于,在2.x+android版本中,您无法在主UI线程中执行网络操作,因为您阻止了它。您应该使用AsynTask,它非常适合这种操作。或者你制作了一个FileTransferThread类。-1你有没有试着向谷歌询问你的例外情况?你投票支持这个问题,因为其中的解决方案帮助了我12-13个小时的挣扎。非常感谢。我尝试使用异步任务。但还有其他警告,请参见下面我的更新。我不确定我是否使用了正确的语法方法head of doInBackground()。我没有任何参数,但我可以给出一个。我将类型从a更改为I。没有更改。我使用了你的类,但当上传文件时,我得到的文件大小为零。我在做什么?我试过使用异步任务。但还有其他警告,请参见下面我的更新。我不确定我是否使用了正确的语法方法head of doInBackground()。我没有任何参数,但我可以给出一个。
sb.append(";type=a");
sb.append(";type=i");