2013-11-15 3 views
1

Я получаю сообщение об ошибке при попытке запустить приложение. Я могу запустить свое приложение и выбрать изображение, но затем сбой приложения. Я действительно не знаю, что не так?Ошибка при загрузке изображения из галереи на сервер

сообщение об ошибке, как показано ниже:

11-15 12:32:44.167: E/AndroidRuntime(24617): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=-1, data=Intent { dat=content://media/external/images/media/328 flg=0x1 }} to activity {com.example.testuploade4/com.example.testuploade4.MainActivity}: android.os.NetworkOnMainThreadException

Вот мой андроид класс:

package com.example.testuploade4; 

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 

import android.app.Activity; 
import android.content.Intent; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.MediaStore; 
import android.util.Log; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

    private static final int SELECT_IMAGE = 1; 
    String selectedPath; 

    String urlString = "http://jadder.dk/sjov/uploade1.php"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     openGallery(); 
    } 

    public void openGallery() { 

     Intent intent = new Intent(); 
     intent.setType("image/*"); 
     intent.setAction(Intent.ACTION_GET_CONTENT); 
     startActivityForResult(Intent.createChooser(intent, "Select Image "), 
       SELECT_IMAGE); 
    } 

    public void onActivityResult(int requestCode, int resultCode, Intent data) { 

     if (resultCode == RESULT_OK) { 
      if (requestCode == SELECT_IMAGE) { 
       System.out.println("SELECT_IMAGE"); 
       Uri selectedImageUri = data.getData(); 
       selectedPath = getPath(selectedImageUri); 
       System.out.println("SELECT_IMAGE Path : " + selectedPath); 
       doFileUpload(); 
      } 
     } 
    } 

    public String getPath(Uri uri) { 
     String[] projection = { MediaStore.Images.Media.DATA }; 
     Cursor cursor = managedQuery(uri, projection, null, null, null); 
     int column_index = cursor 
       .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 
     return cursor.getString(column_index); 
    } 

    private void doFileUpload() { 
     HttpURLConnection conn = null; 
     DataOutputStream dos = null; 
     DataInputStream inStream = null; 
     String lineEnd = "rn"; 
     String twoHyphens = "--"; 
     String boundary = "*****"; 
     int bytesRead, bytesAvailable, bufferSize; 
     byte[] buffer; 
     int maxBufferSize = 1 * 1024 * 1024; 
     String responseFromServer = ""; 
     try { 
      // ------------------ CLIENT REQUEST 
      FileInputStream fileInputStream = new FileInputStream(new File(
        selectedPath)); 
      // open a URL connection to the Servlet 
      URL url = new URL(urlString); 
      // Open a HTTP connection to the URL 
      conn = (HttpURLConnection) url.openConnection(); 
      // Allow Inputs 
      conn.setDoInput(true); 
      // Allow Outputs 
      conn.setDoOutput(true); 
      // Don't use a cached copy. 
      conn.setUseCaches(false); 
      // Use a post method. 
      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=\"uploaded_file\";filename=\"" 
        + selectedPath + "\"" + 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); 
      // close streams 
      Log.e("Debug", "File is written"); 
      fileInputStream.close(); 
      dos.flush(); 
      dos.close(); 
     } catch (MalformedURLException ex) { 
      Log.e("Debug", "error: " + ex.getMessage(), ex); 
     } catch (IOException ioe) { 
      Log.e("Debug", "error: " + ioe.getMessage(), ioe); 
     } 
     // ------------------ read the SERVER RESPONSE 
     try { 
      inStream = new DataInputStream(conn.getInputStream()); 
      String str; 

      while ((str = inStream.readLine()) != null) { 
       Log.e("Debug", "Server Response " + str); 
      } 
      inStream.close(); 

     } catch (IOException ioex) { 
      Log.e("Debug", "error: " + ioex.getMessage(), ioex); 
     } 
    } 
} 

Вот мой PHP код:

<?php 
// Where the file is going to be placed 
$target_path = "uploads/"; 

/* Add the original filename to our target path. 
Result is "uploads/filename.extension" */ 
$target_path = $target_path . basename($_FILES['uploadedfile']['name']); 

if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { 
    echo "The file ". basename($_FILES['uploadedfile']['name']). 
    " has been uploaded"; 
} else{ 
    echo "There was an error uploading the file, please try again!"; 
    echo "filename: " . basename($_FILES['uploadedfile']['name']); 
    echo "target_path: " .$target_path; 
} 
?> 

Теперь я получаю новая ошибка. Думаю Ther проблема заключается в коде PHP, но II не знаю:

Сообщение errror является:

Файл записывается ответ сервера Был ошибка загрузки файла, пожалуйста, попробуйте еще раз имя файла: target_path: добавления/

EDIT:

package com.example.testuploade4; 

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 

import android.app.Activity; 
import android.content.Intent; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.provider.MediaStore; 
import android.util.Log; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

    private static final int SELECT_IMAGE = 1; 
    String selectedPath; 

    String urlString = "http://jadder.dk/sjov/uploade1.php"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     openGallery(); 
    } 

    public void openGallery() { 

     Intent intent = new Intent(); 
     intent.setType("image/*"); 
     intent.setAction(Intent.ACTION_GET_CONTENT); 
     startActivityForResult(Intent.createChooser(intent, "Select Image "), 
       SELECT_IMAGE); 
    } 

    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode == RESULT_OK) { 
      if (requestCode == SELECT_IMAGE) { 
       System.out.println("SELECT_IMAGE"); 
       Uri selectedImageUri = data.getData(); 
       selectedPath = getPath(selectedImageUri); 
       System.out.println("SELECT_IMAGE Path : " + selectedPath); 
       doFileUpload(); 
      } 
     } 
    } 

    public String getPath(Uri uri) { 
     String[] projection = { MediaStore.Images.Media.DATA }; 
     Cursor cursor = managedQuery(uri, projection, null, null, null); 
     int column_index = cursor 
       .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 
     return cursor.getString(column_index); 
    } 

    private void doFileUpload() { 

     new AsyncTask<Void, Void, Void>() { 

      protected Void doInBackground(Void... arg0) { 
       HttpURLConnection conn = null; 
       DataOutputStream dos = null; 
       DataInputStream inStream = null; 
       String lineEnd = "rn"; 
       String twoHyphens = "--"; 
       String boundary = "*****"; 
       int bytesRead, bytesAvailable, bufferSize; 
       byte[] buffer; 
       int maxBufferSize = 1 * 1024 * 1024; 
       String responseFromServer = ""; 
       try { 
        // ------------------ CLIENT REQUEST 
        FileInputStream fileInputStream = new FileInputStream(new File(selectedPath)); 
        // open a URL connection to the Servlet 
        URL url = new URL(urlString); 
        // Open a HTTP connection to the URL 
        conn = (HttpURLConnection) url.openConnection(); 
        // Allow Inputs 
        conn.setDoInput(true); 
        // Allow Outputs 
        conn.setDoOutput(true); 
        // Don't use a cached copy. 
        conn.setUseCaches(false); 
        // Use a post method. 
        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=\"uploaded_file\";filename=\"" + selectedPath + "\"" + 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); 
        // close streams 
        Log.e("Debug", "File is written"); 
        fileInputStream.close(); 
        dos.flush(); 
        dos.close(); 
       } catch (MalformedURLException ex) { 
        Log.e("Debug", "error: " + ex.getMessage(), ex); 
       } catch (IOException ioe) { 
        Log.e("Debug", "error: " + ioe.getMessage(), ioe); 
       } 
       // ------------------ read the SERVER RESPONSE 
       try { 
        inStream = new DataInputStream(conn.getInputStream()); 
        String str; 

        while ((str = inStream.readLine()) != null) { 
         Log.e("Debug", "Server Response " + str); 
        } 
        inStream.close(); 

       } catch (IOException ioex) { 
        Log.e("Debug", "error: " + ioex.getMessage(), ioex); 
       } 

       return null; 
      } 
     }.execute(); 

    } 

} 

Logcat:

11-15 13:30:16.211: D/libEGL(26221): loaded /system/lib/egl/libEGL_adreno200.so 
11-15 13:30:16.211: D/libEGL(26221): loaded /system/lib/egl/libGLESv1_CM_adreno200.so 
11-15 13:30:16.211: D/libEGL(26221): loaded /system/lib/egl/libGLESv2_adreno200.so 
11-15 13:30:16.221: I/Adreno200-EGL(26221): <qeglDrvAPI_eglInitialize:265>: EGL 1.4 QUALCOMM Build: Iabe52cfaeae4c5fab1acacfe6f056ba15fa93274 
11-15 13:30:16.251: D/OpenGLRenderer(26221): Enabling debug mode 0 
11-15 13:30:16.351: D/dalvikvm(26221): GC_FOR_ALLOC freed 104K, 2% free 9228K/9376K, paused 15ms, total 16ms 
11-15 13:30:20.454: I/System.out(26221): SELECT_IMAGE 
11-15 13:30:20.465: I/System.out(26221): SELECT_IMAGE Path : /storage/emulated/0/Download/560843_531646073574745_683776063_n.jpg 
11-15 13:30:20.575: D/dalvikvm(26221): GC_FOR_ALLOC freed 103K, 2% free 9574K/9756K, paused 20ms, total 20ms 
11-15 13:30:20.595: E/Debug(26221): File is written 
11-15 13:30:21.275: E/Debug(26221): Server Response There was an error uploading the file, please try again!filename: target_path: uploads/ 

ответ

0

Метод Youur doFileUpload() работает в MainThread, который должен работать в фоновом режиме.

Try следующим образом,

runOnUiThread(new Runnable(){ 
    public void run() { 
     doFileUpload() 
    } 
}); 
+0

UI нить называется основной поток. Вызов должен быть в фоновом потоке. –

0

Вы должны загрузить файл в AsyncTask как этот

private void doFileUpload() { 

     new AsyncTask<Void, Void, Void>() { 

      @Override 
      protected Void doInBackground(Void... arg0) { 
       HttpURLConnection conn = null; 
       DataOutputStream dos = null; 
       DataInputStream inStream = null; 
       String lineEnd = "rn"; 
       String twoHyphens = "--"; 
       String boundary = "*****"; 
       int bytesRead, bytesAvailable, bufferSize; 
       byte[] buffer; 
       int maxBufferSize = 1 * 1024 * 1024; 
       String responseFromServer = ""; 
       try { 
        // ------------------ CLIENT REQUEST 
        FileInputStream fileInputStream = new FileInputStream(new File(selectedPath)); 
        // open a URL connection to the Servlet 
        URL url = new URL(urlString); 
        // Open a HTTP connection to the URL 
        conn = (HttpURLConnection) url.openConnection(); 
        // Allow Inputs 
        conn.setDoInput(true); 
        // Allow Outputs 
        conn.setDoOutput(true); 
        // Don't use a cached copy. 
        conn.setUseCaches(false); 
        // Use a post method. 
        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\";name=\"" + selectedPath + "\"" + 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); 
        // close streams 
        Log.e("Debug", "File is written"); 
        fileInputStream.close(); 
        dos.flush(); 
        dos.close(); 
       } catch (MalformedURLException ex) { 
        Log.e("Debug", "error: " + ex.getMessage(), ex); 
       } catch (IOException ioe) { 
        Log.e("Debug", "error: " + ioe.getMessage(), ioe); 
       } 
       // ------------------ read the SERVER RESPONSE 
       try { 
        inStream = new DataInputStream(conn.getInputStream()); 
        String str; 

        while ((str = inStream.readLine()) != null) { 
         Log.e("Debug", "Server Response " + str); 
        } 
        inStream.close(); 

       } catch (IOException ioex) { 
        Log.e("Debug", "error: " + ioex.getMessage(), ioex); 
       } 

       return null; 
      } 
     }.execute(); 

    } 
+0

Спасибо большое! Но теперь я получил еще одну ошибку. Файл написан на Server Response Произошла ошибка при загрузке файла. Повторите попытку! Filename: target_path: uploads/ – user2996075

+0

Опубликуйте свой лог-код. –

+0

okay Я добавил logcat в EDIT – user2996075

Смежные вопросы