无法看到从Android设备上传的3gp文件到PHP Server

问题描述:

In my android code, I am trying to upload a .3gp file to XAMPP server. I reused the following code for uploading the file:

 public int uploadFile(String sourceFileUri) {

     String fileName = sourceFileUri;

     HttpURLConnection conn = null;
     DataOutputStream dos = null;  
     String lineEnd = "
";
     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 :"
                              +uploadFilePath + "" + uploadFileName);

          runOnUiThread(new Runnable() {
              public void run() {
                  Toast.makeText(getApplicationContext(), "Source File not exist :"
                          +uploadFilePath + "" + uploadFileName, Toast.LENGTH_LONG).show();
              }
          }); 
          return 0;
     } else {
          try { 
                // open a URL connection to the Servlet
              FileInputStream fileInputStream = new FileInputStream(sourceFile);
              URL url = new URL(upLoadServerUri);

              // 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("uploaded_file", fileName); 

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

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

              Log.i("uploadFile", "HTTP Response is : "
                      + serverResponseMessage + ": " + serverResponseCode);

              if(serverResponseCode == 200){

                  runOnUiThread(new Runnable() {
                       public void run() {
                           String msg = "File Upload Completed.

 See uploaded file here : 

"
                                         +" http://www.androidexample.com/media/uploads/" +uploadFileName;
                           Toast.makeText(getApplicationContext(), "File Upload Complete.", 
                                        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() {

                     Toast.makeText(getApplicationContext(), "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() {
                     Toast.makeText(getApplicationContext(), "Got Exception : see logcat ", 
                             Toast.LENGTH_SHORT).show();
                 }
             });
             Log.e("Upload file to server Exception", "Exception : "
                                              + e.getMessage(), e);  
         }
         dialog.dismiss();       
         return serverResponseCode; 

      } // End else block 
 }

With the following parameters:

  String upLoadServerUri = "http://"+iPAddress+"/patient/upload.php";

  /**********  File Path *************/
  final String uploadFilePath =  Environment.getExternalStorageDirectory().getPath()+"/Patient_Records/";
  final String uploadFileName = "record.3gp";

below is my upload.php file:

<?php

   $file_path = "uploads/";

   $file_path = $file_path . basename( $_FILES['uploaded_file']['name']);
   if(move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $file_path)) {
       echo "success";
   } else{
       echo "fail";
   }
?>

I do have a directory uploads in the same directory of upload.php, more specifically:

The PHP file upload.php full path is: C:\xampp\htdocs\patient\upload.php The upload directory full path is: C:\xampp\htdocs\patient\uploads

The android activity does not complain. During runtime, I get the message "File Upload Complete." as if everything went well. However, I do NOT find the uploaded file in the upload directory. What's wrong?

I would recommend you using HttpClient class to send data in the form of multi-part. There's a simple solution mentioned here Video file transfer from Android phone to server (https://stackoverflow.com/a/17673687/2482430) which can be useful for you

Code

public void uploadVideo(Context context, String videoPath) {
        try {
            HttpClient httpClient = new DefaultHttpClient();
            HttpPost postRequest = new HttpPost(context.getString(R.string.url_service_fbpost));
            MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
            if(!videoPath.isEmpty()){

                FileBody filebodyVideo = new FileBody(new File(videoPath));
                reqEntity.addPart("uploaded", filebodyVideo);
            }
            postRequest.setEntity(reqEntity);
            HttpResponse response = httpClient.execute(postRequest);

            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    response.getEntity().getContent(), "UTF-8"));
            String sResponse;
            StringBuilder s = new StringBuilder();

            while ((sResponse = reader.readLine()) != null) {
                s = s.append(sResponse);
            }

            Log.e("Response: ", s.toString());
            return true;

        } catch (Exception e) {
            Log.e(e.getClass().getName(), e.getMessage());
            return false;
        }
}