Код для загрузки видео с Android на PHP

Я пытаюсь загрузить видео с Android-кода на свой код веб-сервера PHP, но не могу добиться успеха. Я имею в виду следующую ссылку для выполнения задачи загрузки, но я получаю следующий ответ в своем коде Android, но не могу найти файл на сервере PHP.

Реакция Android

DEBUG/ServerCode(29484): 200 DEBUG/serverResponseMessage(29484): OK 

Я проверил многие вещи, такие как установочные значения в файлах php.ini . Хотя я могу загружать изображения с Android-кода на сервер, потому что от Android я отправляю 64-битный кодированный ByteArray а therer – это готовая функция в php, которая может создавать изображение из закодированных ByteArray s.

Но этот код также не работает в случае, если какой-либо другой файл имеет тип, отличный от изображения.

Пожалуйста, направляйте меня, если кто-то из вас сделал что-то подобное раньше.

PHP-код, который я использую:

 <?php $target_path = "./upload/"; $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!"; } ?> 

Код Android, который я использую:

 public void videoUpload() { HttpURLConnection connection = null; DataOutputStream outputStream = null; DataInputStream inputStream = null; String pathToOurFile = "/sdcard/video-2010-03-07-15-40-57.3gp"; String urlServer = "http://10.0.0.15/sampleWeb/handle_upload.php"; String lineEnd = "\r\n"; String twoHyphens = "--"; String boundary = "*****"; int bytesRead, bytesAvailable, bufferSize; byte[] buffer; int maxBufferSize = 1*1024*1024; try { FileInputStream fileInputStream = new FileInputStream(new File(pathToOurFile) ); URL url = new URL(urlServer); connection = (HttpURLConnection) url.openConnection(); // Allow Inputs & Outputs connection.setDoInput(true); connection.setDoOutput(true); connection.setUseCaches(false); // Enable POST method connection.setRequestMethod("POST"); connection.setRequestProperty("Connection", "Keep-Alive"); connection.setRequestProperty("Content-Type", "multipart/form-data;boundary"); outputStream = new DataOutputStream( connection.getOutputStream() ); outputStream.writeBytes(twoHyphens + boundary + lineEnd); outputStream.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + pathToOurFile ); outputStream.writeBytes(lineEnd); bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); buffer = new byte[bufferSize]; // Read file bytesRead = fileInputStream.read(buffer, 0, bufferSize); while (bytesRead > 0) { outputStream.write(buffer, 0, bufferSize); bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); bytesRead = fileInputStream.read(buffer, 0, bufferSize); } outputStream.writeBytes(lineEnd); outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); // Responses from the server (code and message) int serverResponseCode = connection.getResponseCode(); String serverResponseMessage = connection.getResponseMessage(); Log.d("ServerCode",""+serverResponseCode); Log.d("serverResponseMessage",""+serverResponseMessage); fileInputStream.close(); outputStream.flush(); outputStream.close(); } catch (Exception ex) { ex.printStackTrace(); } } 

Моя java немного канатная, но …

Похоже, connection.getResponseCode возвращает только код состояния HTTP, а connection.getResponseMessage возвращает только сообщение о статусе HTTP – но вы PHP не делает ничего, чтобы манипулировать этими значениями. Вы можете попробовать:

 $target_path = "./upload/"; $src = $_FILES['uploadedfile']['name']; $target_path .= basename($src); if(file_exists($src) && && move_uploaded_file($src, $target_path) ) { echo "The file ".basename( $_FILES['uploadedfile']['name'])." has been uploaded"; } else { header("Server Error", true, 503); echo "There was an error uploading the file, please try again!"; $msg = "src size ? " . filesize($src) . "\n dest dir writable ?" . is_writeable(dirname($target_path)) ? "Y\n" : "N\n" . "FILES contains :\n"; . var_export($_FILES,true); // now write $msg somwhere you can read it } 

Это помогло сузить то, что пошло не так

 private String mString; private Uri image_uri; private String response; private HttpURLConnection conn = null; private DataOutputStream dos = null; private String lineEnd = "\r\n"; private String twoHyphens = "--"; private String boundary = "*****"; private int bytesRead, bytesAvailable, bufferSize; private byte[] buffer; private String url_for_image_upload = "your_web_api_put_here"; private int maxBufferSize = 1 * 1024 * 1024; 

// затем вызовите эти два метода в onclick-прослушивателе кнопки

mString = getRealPathFromURI (image_uri);

ImageUpload ();

// пишем эти методы здесь

 private void ImageUpload() { Toast.makeText(getApplicationContext(), "Please Wait while uploading Image", Toast.LENGTH_SHORT).show(); try { FileInputStream fileInputStream = new FileInputStream(new File(mString)); URL url = new URL(url_for_image_upload); conn = (HttpURLConnection) url.openConnection(); conn.setDoInput(true); conn.setDoOutput(true); conn.setUseCaches(false); 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=\"img_name\";filename=\"img_name" + "\"" + 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); BufferedReader in = new BufferedReader(new InputStreamReader( conn.getInputStream())); Log.d("BuffrerReader", "" + in); if (in != null) { response = convertStreamToString(in); Log.e("FINAL_RESPONSE-LENGTH",""+response.length()); Log.e("FINAL_RESPONSE", response); } fileInputStream.close(); dos.flush(); dos.close(); if (response.startsWith("0")) { Toast.makeText(getApplicationContext(), "Image Uploaded not successfully", Toast.LENGTH_SHORT) .show(); } else { Toast.makeText(getApplicationContext(), "Image Uploaded successfully", Toast.LENGTH_SHORT) .show(); } } catch (MalformedURLException ex) { Log.e("Image upload", "error: " + ex.getMessage(), ex); } catch (IOException ioe) { Log.e("Image upload", "error: " + ioe.getMessage(), ioe); } } public String getRealPathFromURI(Uri contentUri) { String[] proj = { MediaColumns.DATA }; @SuppressWarnings("deprecation") Cursor cursor = managedQuery(contentUri, proj, null, null, null); int column_index = cursor .getColumnIndexOrThrow(MediaColumns.DATA); cursor.moveToFirst(); mString = cursor.getString(column_index); return mString; } public static String convertStreamToString(BufferedReader is) throws IOException { if (is != null) { StringBuilder sb = new StringBuilder(); String line; try { while ((line = is.readLine()) != null) { sb.append(line).append(""); } } finally { is.close(); } return sb.toString(); } else { return ""; } }