2014-02-14 4 views
1

Основываясь на рекомендациях предыдущего сообщения, я пытаюсь использовать Android: Uploading image on server with php, однако я получаю исключение, не найденное в файле.Загрузка файлов на сервер

Вот моя функция, описанная выше в сообщении. Мой вход для них:

Галерея: uploadFile: Source File not exist :content://media/external/images/media/342 Фото: uploadFile: Source File not exist: file:///storage/emulated/0/MyDir/blah

Эти Ури вытекают из намерения lanched в catputre/выбрать их. Любые идеи, почему я получаю исключение File Not Found?

private void doFileUpload(String exsistingFileName){ 
    HttpURLConnection conn = null; 
    DataOutputStream dos = null; 
    DataInputStream inStream = null; 

    //String exsistingFileName = "/sdcard/six.3gp"; 
    // Is this the place are you doing something wrong. 

    String lineEnd = "\r\n"; 
    String twoHyphens = "--"; 
    String boundary = "*****"; 
    int bytesRead, bytesAvailable, bufferSize; 
    byte[] buffer; 
    int maxBufferSize = 1*1024*1024; 
    String urlString = "http://192.168.1.5/upload.php"; 
    try 
    { 
     Log.e("MediaPlayer","Inside second Method"); 
     FileInputStream fileInputStream = new FileInputStream(new File(exsistingFileName)); 
     URL url = new URL(urlString); 
     conn = (HttpURLConnection) url.openConnection(); 
     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\";filename=\"" + exsistingFileName +"\"" + lineEnd); 
     dos.writeBytes(lineEnd); 
     Log.e("MediaPlayer","Headers are written"); 
     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); 
     BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
     String inputLine; 
     String LogString = ""; 

     while ((inputLine = in.readLine()) != null) { 
      LogString= LogString + inputLine; 
     } 

     Log.i(Utils.TAG, LogString); 
     // close streams 
     fileInputStream.close(); 
     dos.flush(); 
     dos.close(); 
    } 
    catch (MalformedURLException ex) 
    { 
     Log.e("MediaPlayer", "error: " + ex.getMessage(), ex); 
    } 
    catch (IOException ioe) 
    { 
     Log.e("MediaPlayer", "error: " + ioe.getMessage(), ioe); 
    } 

    //------------------ read the SERVER RESPONSE 
    try { 
     inStream = new DataInputStream (conn.getInputStream()); 
     String str;    
     while ((str = inStream.readLine()) != null) 
     { 
      Log.e("MediaPlayer","Server Response"+str); 
     } 
     /*while((str = inStream.readLine()) !=null){ 

     }*/ 
     inStream.close(); 
    } 
    catch (IOException ioex){ 
     Log.e("MediaPlayer", "error: " + ioex.getMessage(), ioex); 
    } 
} 

ответ

1

я получить файл не найден исключение

Это потому, что ни один из этих путей к файлам. Вы можете это сказать, глядя на них. Вы также не выполнили инструкции от my previous answer.

Заменить:

FileInputStream fileInputStream = new FileInputStream(new File(exsistingFileName)); 

с:

InputStream contentInputStream = getContentResolver().openInputStream(Uri.parse(exsistingFileName)); 

(и заменить вхождения fileInputStream с contentInputStream для остальной части вашего метода)

Заметим, что:

  • Предполагается, что ваш doFileUpload() реализован на некотором классе, который наследуется от Context, например Activity или Service. Вам необходимо будет получить ContentResolver до doFileUpload() другими способами, если doFileUpload() не имеет доступа к getContentResolver().

  • Вы могли бы упростить вопросы немного пропускания в Uri вы получили в doFileUpload(), а не превращение его в String, а затем обратно в Uri.

  • Вам нужно будет придумать собственное имя файла для заголовка Content-Disposition:, так как вы не получите имя файла из Uri.

+0

Я также сказал, что ваш последний ответ может быть у меня над головой. – jcaruso

+0

@jcaruso: Если вы не объясните * конкретно * то, что вы не понимаете, никто не сможет предложить разъяснения. – CommonsWare

+0

Я просто не хотел, чтобы вы объяснили это больше, не прочитав сначала. Я, хотя я понял и сделал то, что вы просили, но, очевидно, я ошибся. Я ненавижу людей, которые не занимаются исследованиями и не ожидают, что они будут жесткими. Тем не менее, вернемся к вашим изменениям выше, похоже, сработало (у меня есть файл, загруженный на мой сервер хотя бы), но он не имеет расширения (jpg/png), хотя он делает рендеринг, когда я перехожу на url – jcaruso

0

Вы пытаетесь получить InputStream от Uri? Это может быть проще:

private void doFileUpload(Uri fileUri){ 
    // some code 
    InputStream inputStream = getContentResolver().openInputStream(fileUri); 
    // more code 
    dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + "some_file_name" +"\"" + lineEnd); 
    // the rest of the code 
} 
Смежные вопросы