文件上传到Android中的服务器问题 [英] File Upload to server issues in Android

查看:223
本文介绍了文件上传到Android中的服务器问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有代码文件上传到服务器其代码工作个人,但这在我的应用程序中执行其goto异常所有的时间



这里是我的代码

  public int uploadFile(String sourceFileUri){
String fileName = sourceFileUri;

HttpURLConnection conn = null;
DataOutputStream dos = null;
String lineEnd =\r\\\
;
String twoHyphens = - ;
String boundary =*****;
int bytesRead,bytesAvailable,bufferSize;
byte [] buffer;
int maxBufferSize = 1 * 1024 * 1024;
文件sourceFile =新文件(sourceFileUri); $!
$ b if(!sourceFile.isFile()){

// dialog.dismiss();

Log.e(uploadFile,源文件不存在:
+ selectedFilePath);

runOnUiThread(new Runnable(){
public void run(){
// messageText.setText(Source File not exist:
// + selectedFilePath );
}
});

返回0;

} else {
int serverResponseCode = 0;

尝试{

//打开一个URL连接到Servlet
FileInputStream fileInputStream = new FileInputStream(sourceFile);
网址url =新网址(uploadurl);

//打开一个HTTP连接到URL
conn =(HttpURLConnection)url.openConnection();
conn.setDoInput(true); //允许输入
conn.setDoOutput(true); //允许输出
conn.setUseCaches(false); //不要使用缓存副本
conn.setRequestMethod(POST);
conn.setRequestProperty(Connection,Keep-Alive);
conn.setRequestProperty(ENCTYPE,multipart / form-data);
conn.setRequestProperty(Content-Type,multipart / form-data; boundary =+ boundary);
conn.setRequestProperty(userfile,fileName);

dos = new DataOutputStream(conn.getOutputStream());

dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes(Content-Disposition:form-data; name = \userfile \; filename = \
+ fileName +\+ 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);

//服务器响应(代码和消息)
serverResponseCode = conn.getResponseCode();
String serverResponseMessage = conn.getResponseMessage();
最终字符串响应;
Log.i(uploadFile,HTTP Response is:
+ serverResponseMessage +:+ serverResponseCode + serverResponseMessage);
字符串数据;
if(serverResponseCode == 200){

final HttpURLConnection finalConn = conn;
runOnUiThread(new Runnable(){
public void run(){
$ b / * String msg =File Upload Completed.\\\
\\\
在此处上传文件: \\\
\\\

+http://www.androidexample.com/media/uploads/
+ uploadFileName; * /

//messageText.setText (msg);
String data = null;
BufferedReader in = null;
尝试{
in = new BufferedReader(new
InputStreamReader(
finalConn。 getInputStream()));
StringBuilder result = new StringBuilder();
String line;
$ b $ while while((line = in.readLine())!= null){

result.append(线);

data = result.toString();
break;
}
} catch(IOException e){
e.printStackTrace();


$ b Toast.makeText(Individual_Message.this,File Upload Complete。+ data,
Toast.LENGTH_SHORT).show();
}
});
}

//关闭流//
fileInputStream.close();
dos.flush();
dos.close();
$ b $ catch(MalformedURLException ex){

//dialog.dismiss();
ex.printStackTrace();
$ b $ runOnUiThread(new Runnable(){
public void run(){
//messageText.setText(\"MalformedURLException Exception:check script url。);
Toast.makeText(Individual_Message.this,MalformedURLException,Toast.LENGTH_SHORT).show();
}
}); (上传文件到服务器,错误:+ ex.getMessage(),前);

Log.e
} catch(Exception e){

// dialog.dismiss();
e.printStackTrace();

runOnUiThread(new Runnable(){
public void run(){
// messageText.setText(Exception Exception:see logcat);
Toast。 makeText(Individual_Message.this,Got Exception:see logcat,
Toast.LENGTH_SHORT).show();
}
});
Log.e(Upload file,Exception:
+ e.getMessage(),e);
}
//dialog.dismiss();
返回serverResponseCode;


$ b code


$ b

单独运行得到确切的结果,但里面我的应用程序

获取日志类似于

  V / Selected File Path :: /storage/emulated/0/temporary_file_0.jpg 
V / FA:活动恢复,时间:268130823
V / FA:不活跃,从AppMeasurementService断开连接
W / System.err:android .os.NetworkOnMainThreadException
W / System.err:在android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
W / System.err:在libcore.io.BlockGuardOs.recvfrom BlockGuardOs.java:249)
W / System.err:在libcore.io.IoBridge.recvfrom(IoBridge.java:549)
W / System.err:在java.net.PlainSocketImpl.read(
W / System.err:在java.net.PlainSocketImpl.- wrap0(PlainSocketImpl.java)
W / System.err:在java.net.PlainSocketImpl $ PlainSocketInputStream.read (PlainSocketImpl.java:237)
W / System.err:at com.android.okht tp.okio.Okio $ 2.read(Okio.java:135)
W / System.err:at com.android.okhttp.okio.AsyncTimeout $ 2.read(AsyncTimeout.java:211)
W /System.err:com.android.okhttp.okio.RealBufferedSource.exhausted(RealBufferedSource.java:60)
W / System.err:at com.android.okhttp.internal.http.HttpConnection.isReadable(HttpConnection .java:155)
W / System.err:at com.android.okhttp.Connection.isReadable(Connection.java:235)
W / System.err:at com.android.okhttp.OkHttpClient $ 1.isReadable(OkHttpClient.java:91)
W / System.err:at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:350)
W / System.err :at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:340)
W / System.err:at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java :330)
W / System.err:at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248)
W / System.err:at com.android.okhttp 。内部。 (HttpURLConnectionImpl.java:114)
W /系统。 err:at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:245)
W / System.err:at technologies.codegreen.com.drzonesample.My_Messages.Individual_Message.uploadFile(Individual_Message。 java:355)
W / System.err:at technologies.codegreen.com.drzonesample.My_Messages.Individual_Message $ 2.onClick(Individual_Message.java:148)
W / System.err:在android.view .View.performClick(View.java:5204)
W / System.err:在android.view.View $ PerformClick.run(View.java:21153)
W / System.err:在android .os.Handler.handleCallback(Handler.java:739)
W / System.err:在android.os.Handler.dispatchMessage(Handler.java:95)
W / System.err:在android .os.Looper.loop(Looper.java:148)
W / System.err:at android.app.Ac tivityThread.main(ActivityThread.java:5480)
W / System.err:在java.lang.reflect.Method.invoke(本地方法)
W / System.err:在com.android.internal .os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726)
W / System.err:at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
E /上传文件:例外:null
android.os.NetworkOnMainThreadException $ b $ android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
在libcore.io.BlockGuardOs.recvfrom(BlockGuardOs .java:249)
at libcore.io.IoBridge.recvfrom(IoBridge.java:549)
at java.net.PlainSocketImpl.read(PlainSocketImpl.java:481)
at java。 net.PlainSocketImpl.-wrap0(PlainSocketImpl.java)
at java.net.PlainSocketImpl $ PlainSocketInputStream.read(PlainSocketImpl.java:237)
at com.android.okhttp.okio.Okio $ 2.read( Okio.java:135)
at com.android.okhttp.okio.AsyncTimeout $ 2.read(AsyncTimeout.java:211)
at com.android.okhttp.okio.RealBufferedSource.exhausted(RealBufferedSource.java:60)
at com。 android.okhttp.internal.http.HttpConnection.isReadable(HttpConnection.java:155)
at com.android.okhttp.Connection.isReadable(Connection.java:235)
at com.android.okhttp。 OkHttpClient $ 1.isReadable(OkHttpClient.java:91)
at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:350)
at com.android.okhttp.internal.http .HttpEngine.nextConnection(HttpEngine.java:340)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330)
at com.android.okhttp.internal.http .HttpEngine.sendRequest(HttpEngine.java:248)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:437)
(com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:114)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:245)
at technologies.codegreen.com.drzonesample.My_Messages.Individual_Message.uploadFile(Individual_Message.java:355)
at technologies.codegreen.com.drzonesample.My_Messages.Individual_Message $ 2.onClick(Individual_Message.java:148)
在android.view.View.performClick(View.java:5204)
在android.view.View $ PerformClick.run(View.java:21153)
在android.os.Handler.handleCallback( Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android .app.ActivityThread.main(ActivityThread.java:5480)
at java.lang.reflect.Method.invoke(Native Met hod)
at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)


解决方案

 应用程序没有响应的错误,android避免你在UI线程中同步做任何长时间的操作。 
您可以按如下方式异步执行单独的线程。

创建一个不同的类
private class DownloadFilesTask extends AsyncTask< URL,Integer,Long> {
protected Long doInBackground(URL ... urls){
int count = urls.length;
long totalSize = 0;
for(int i = 0; i< count; i ++){
//写下您的文件下载代码。
publishProgress((int)((i /(float)count)* 100));
//如果调用cancel(),则提前退出
if(isCancelled())break;
}
return totalSize;


protected void onProgressUpdate(Integer ... progress){
setProgressPercent(progress [0]);


protected void onPostExecute(Long result){
showDialog(Downloaded+ result +bytes);
}
}

并在上传文件方法中调用此方法。

new DownloadFilesTask()。execute(url1,url2,url3);

理论https://developer.android.com/reference/android/os/AsyncTask.html


i have code for file uploading to server its code working individual but this implemented in my app its goto exception all the time

here is my code

 public int uploadFile(String sourceFileUri) {
    String fileName = sourceFileUri;

    HttpURLConnection conn = null;
    DataOutputStream dos = null;
    String lineEnd = "\r\n";
    String twoHyphens = "--";
    String boundary = "*****";
    int bytesRead, bytesAvailable, bufferSize;
    byte[] buffer;
    int maxBufferSize = 1 * 1024 * 1024;
    File sourceFile = new File(sourceFileUri);

    if (!sourceFile.isFile()) {

       // dialog.dismiss();

        Log.e("uploadFile", "Source File not exist :"
                + selectedFilePath);

        runOnUiThread(new Runnable() {
            public void run() {
              //  messageText.setText("Source File not exist :"
                      //  + selectedFilePath);
            }
        });

        return 0;

    } else {
        int serverResponseCode = 0;

        try {

            // open a URL connection to the Servlet
            FileInputStream fileInputStream = new FileInputStream(sourceFile);
            URL url = new URL(uploadurl);

            // Open a HTTP  connection to  the URL
            conn = (HttpURLConnection) url.openConnection();
            conn.setDoInput(true); // Allow Inputs
            conn.setDoOutput(true); // Allow Outputs
            conn.setUseCaches(false); // Don't use a Cached Copy
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Connection", "Keep-Alive");
            conn.setRequestProperty("ENCTYPE", "multipart/form-data");
            conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
            conn.setRequestProperty("userfile", fileName);

            dos = new DataOutputStream(conn.getOutputStream());

            dos.writeBytes(twoHyphens + boundary + lineEnd);
            dos.writeBytes("Content-Disposition: form-data; name=\"userfile\";filename=\""
                    + fileName + "\"" + lineEnd);

            dos.writeBytes(lineEnd);

            // create a buffer of  maximum size
            bytesAvailable = fileInputStream.available();

            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            buffer = new byte[bufferSize];

            // read file and write it into form...
            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);

            }

            // send multipart form data necesssary after file data...
            dos.writeBytes(lineEnd);
            dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

            // Responses from the server (code and message)
            serverResponseCode = conn.getResponseCode();
            String serverResponseMessage = conn.getResponseMessage();
            final String response;
            Log.i("uploadFile", "HTTP Response is : "
                    + serverResponseMessage + ": " + serverResponseCode + serverResponseMessage);
            String data;
            if (serverResponseCode == 200) {

                final HttpURLConnection finalConn = conn;
                runOnUiThread(new Runnable() {
                    public void run() {

                            /*String msg = "File Upload Completed.\n\n See uploaded file here : \n\n"
                                          +" http://www.androidexample.com/media/uploads/"
                                          +uploadFileName;*/

                        //messageText.setText(msg);
                        String data = null;
                        BufferedReader in = null;
                        try {
                            in = new BufferedReader(new
                                    InputStreamReader(
                                    finalConn.getInputStream()));
                            StringBuilder result = new StringBuilder();
                            String line;

                            while ((line = in.readLine()) != null) {

                                result.append(line);

                                data = result.toString();
                                break;
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }


                        Toast.makeText(Individual_Message.this, "File Upload Complete." + data,
                                Toast.LENGTH_SHORT).show();
                    }
                });
            }

            //close the streams //
            fileInputStream.close();
            dos.flush();
            dos.close();

        } catch (MalformedURLException ex) {

            //dialog.dismiss();
            ex.printStackTrace();

            runOnUiThread(new Runnable() {
                public void run() {
                    //messageText.setText("MalformedURLException Exception : check script url.");
                    Toast.makeText(Individual_Message.this, "MalformedURLException", Toast.LENGTH_SHORT).show();
                }
            });

            Log.e("Upload file to server", "error: " + ex.getMessage(), ex);
        } catch (Exception e) {

            // dialog.dismiss();
            e.printStackTrace();

            runOnUiThread(new Runnable() {
                public void run() {
                    //  messageText.setText("Got Exception : see logcat ");
                    Toast.makeText(Individual_Message.this, "Got Exception : see logcat ",
                            Toast.LENGTH_SHORT).show();
                }
            });
            Log.e("Upload file", "Exception : "
                    + e.getMessage(), e);
        }
        //dialog.dismiss();
        return serverResponseCode;

    }
}

individually running get exact result but inside my app

get log cat like

    V/Selected File Path:: /storage/emulated/0/temporary_file_0.jpg
V/FA: Activity resumed, time: 268130823
V/FA: Inactivity, disconnecting from AppMeasurementService
W/System.err: android.os.NetworkOnMainThreadException
W/System.err:     at          android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
W/System.err:     at      libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:249)
W/System.err:     at libcore.io.IoBridge.recvfrom(IoBridge.java:549)
W/System.err:     at  java.net.PlainSocketImpl.read(PlainSocketImpl.java:481)
W/System.err:     at java.net.PlainSocketImpl.-    wrap0(PlainSocketImpl.java)
W/System.err:     at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:237)
W/System.err:     at com.android.okhttp.okio.Okio$2.read(Okio.java:135)
W/System.err:     at com.android.okhttp.okio.AsyncTimeout$2.read(AsyncTimeout.java:211)
W/System.err:     at com.android.okhttp.okio.RealBufferedSource.exhausted(RealBufferedSource.java:60)
W/System.err:     at com.android.okhttp.internal.http.HttpConnection.isReadable(HttpConnection.java:155)
W/System.err:     at com.android.okhttp.Connection.isReadable(Connection.java:235)
W/System.err:     at com.android.okhttp.OkHttpClient$1.isReadable(OkHttpClient.java:91)
W/System.err:     at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:350)
W/System.err:     at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:340)
W/System.err:     at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330)
W/System.err:     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute HttpURLConnectionImpl.java:437)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:114)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:245)
W/System.err:     at technologies.codegreen.com.drzonesample.My_Messages.Individual_Message.uploadFile(Individual_Message.java:355)
W/System.err:     at technologies.codegreen.com.drzonesample.My_Messages.Individual_Message$2.onClick(Individual_Message.java:148)
W/System.err:     at android.view.View.performClick(View.java:5204)
W/System.err:     at android.view.View$PerformClick.run(View.java:21153)
W/System.err:     at android.os.Handler.handleCallback(Handler.java:739)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
W/System.err:     at android.os.Looper.loop(Looper.java:148)
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5480)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
E/Upload file: Exception : null
           android.os.NetworkOnMainThreadException
               at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
               at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:249)
               at libcore.io.IoBridge.recvfrom(IoBridge.java:549)
               at java.net.PlainSocketImpl.read(PlainSocketImpl.java:481)
               at java.net.PlainSocketImpl.-wrap0(PlainSocketImpl.java)
               at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:237)
               at com.android.okhttp.okio.Okio$2.read(Okio.java:135)
               at com.android.okhttp.okio.AsyncTimeout$2.read(AsyncTimeout.java:211)
               at com.android.okhttp.okio.RealBufferedSource.exhausted(RealBufferedSource.java:60)
               at com.android.okhttp.internal.http.HttpConnection.isReadable(HttpConnection.java:155)
               at com.android.okhttp.Connection.isReadable(Connection.java:235)
               at com.android.okhttp.OkHttpClient$1.isReadable(OkHttpClient.java:91)
               at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:350)
               at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:340)
               at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330)
               at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248)
               at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:437)
               at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:114)
               at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:245)
               at technologies.codegreen.com.drzonesample.My_Messages.Individual_Message.uploadFile(Individual_Message.java:355)
               at technologies.codegreen.com.drzonesample.My_Messages.Individual_Message$2.onClick(Individual_Message.java:148)
               at android.view.View.performClick(View.java:5204)
               at android.view.View$PerformClick.run(View.java:21153)
               at android.os.Handler.handleCallback(Handler.java:739)
               at android.os.Handler.dispatchMessage(Handler.java:95)
               at android.os.Looper.loop(Looper.java:148)
               at android.app.ActivityThread.main(ActivityThread.java:5480)
               at java.lang.reflect.Method.invoke(Native Method)
               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

解决方案

To avoid the application not responding error, android avoids you to do any long operation in UI thread synchronously. 
You have do to it in a separated thread asynchronously as follows.  

Create a different class 
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {             
//write your code of file download. 
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }

and in upload file method just call this. 

new DownloadFilesTask().execute(url1, url2, url3);

Theory https://developer.android.com/reference/android/os/AsyncTask.html

这篇关于文件上传到Android中的服务器问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆