2016-02-03 5 views
0

Я хочу отправить токен доступа как многостраничные данные вместе с файлом на php-сервер. Я написал следующий код, но он дает ошибку 401 Unauthorized. Я думаю, что не пропускаю access_token. Как это сделать?Загрузка многопользовательского файла Android с токеном доступа

import java.io.DataOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.HashMap; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.truelancer.app.utility.DatabaseHandler; 
import com.truelancer.app.utility.TLConstants; 

public class UploadToServer extends Activity { 

    TextView messageText; 

    TLConstants tlConstants; 

    Button uploadButton; 
    int serverResponseCode = 0; 
    ProgressDialog dialog = null; 

    String upLoadServerUri = null; 

    /********** File Path *************/ 
    final String uploadFilePath = "/mnt/sdcard/"; 
    final String uploadFileName = "service_lifecycle.png"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_upload_to_server); 

     uploadButton = (Button)findViewById(R.id.uploadButton); 
     messageText = (TextView)findViewById(R.id.messageText); 

     tlConstants=new TLConstants(); 

     messageText.setText("Uploading file path :- '/mnt/sdcard/"+uploadFileName+"'"); 

     /************* Php script path ****************/ 

     upLoadServerUri = tlConstants.getURL(tlConstants.uploadFile); 

     uploadButton.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       dialog = ProgressDialog.show(UploadToServer.this, "", "Uploading file...", true); 

       new Thread(new Runnable() { 
        public void run() { 
         runOnUiThread(new Runnable() { 
          public void run() { 
           messageText.setText("uploading started....."); 
          } 
         }); 

         uploadFile(uploadFilePath + "" + uploadFileName); 

        } 
       }).start(); 
      } 
     }); 
    } 

    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 :" 
        +uploadFilePath + "" + uploadFileName); 

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

      return 0; 

     } 
     else 
     { 
      try { 

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

       DatabaseHandler databaseHandler = new DatabaseHandler(getApplicationContext()); 
       HashMap<String, String> databaseMap = databaseHandler.getUserLoginAuthDetails(); 

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


       String access_token= databaseMap.get("accesstoken"); 
       dos = new DataOutputStream(conn.getOutputStream()); 

       dos.writeBytes(twoHyphens + boundary + lineEnd); 

       dos.write(("Content-Disposition: form-data; name=\"" + "access_token" + "\"\r\n").getBytes()); 
       dos.write(("\r\n" + access_token + "\r\n").getBytes()); 



       // 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.\n\n See uploaded file here : \n\n" 
            +"../media/uploads/" 
            +uploadFileName; 

          messageText.setText(msg); 
          Toast.makeText(UploadToServer.this, "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() { 
         messageText.setText("MalformedURLException Exception : check script url."); 
         Toast.makeText(UploadToServer.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(UploadToServer.this, "Got Exception : see logcat ", 
           Toast.LENGTH_SHORT).show(); 
        } 
       }); 
       Log.e("Upload Exception", "Exception : " 
         + e.getMessage(), e); 
      } 
      dialog.dismiss(); 
      return serverResponseCode; 

     } // End else block 
    } 
} 

ответ

0

Это зависит от конфигурации сервера. В общем случае, если вам нужно передать токен авторизации с помощью Http POST, его передать с заголовком setHeader. Вот мой фрагмент рабочего кода для многофакторной загрузки файлов.

HttpClient client = new DefaultHttpClient(); 
File file = new File(selectedImagePath); 
HttpPost post = new HttpPost(uploadUrl); 

post.setHeader("token", myAuthToken); 
post.setHeader("Content-type", "multipart/form-data; boundary=" + boundary); 
MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE, 
        Constants.BOUNDARY, Charset.defaultCharset()); 

entity.addPart(Constants.MULTIPART_FORM_DATA_NAME, new FileBody(file)); 
post.setHeader("Accept", "application/json"); 
post.setHeader("Content-Type", "multipart/form-data; boundary=" + boundary); 

post.setEntity(entity); 

HttpResponse response = client.execute(post); 
HttpEntity httpEntity = response.getEntity(); 
Log.d("Response", EntityUtils.toString(httpEntity)); 
+0

Спасибо Reaz за помощью. Можете ли вы сказать мне, пожалуйста, как читать ответ здесь? Будем благодарны. Заранее спасибо. –

+0

См. Отредактированный ответ. Если ответ будет полезен, пожалуйста, примите его и увеличьте. –

+0

Я пробовал ваш код и читал ответ тоже. Сервер говорит, что он не получает параметр access_token. Вот ответ от сервера: { \t «ошибка»: «invalid_request», \t «error_description»: «Запрос отсутствует необходимый параметр, содержит недопустимое значение параметра, включает в себя параметр более одного раза , или в противном случае неверно. Проверьте параметр «токен доступа». } Я изменил эту строку в вашем коде: post.setHeader ("access_token", myAuthToken); –

0

Рабочая копия Multipart загрузки изображений с помощью службы:

private MutipartImageUploadModel handleUploadAction(int tileId) { 
     String imageName = getTilesInUploadPath(this, fileId); 
     if (imageName == null) { 
      return null; 
     } 
     InputStream responseInputStream; 
     try { 
      File filesDir = getApplicationContext().getFilesDir(); 
      File imageFile = new File(filesDir, imageName); 
      HttpClient httpClient = new DefaultHttpClient(); 
      HttpContext localContext = new BasicHttpContext(); 
      double bytes = imageFile.length(); 
      HttpPost httpPost = new HttpPost(ServiceConstantInterface.URL_UPLOAD_IMAGE);   httpPost.setHeader(ServiceConstantInterface.Authorization_KEY, ServiceConstantInterface.Authorization_KEY_VALUE); 
      httpPost.setHeader("SessionKey", new SharedPrefDataSupplier(this).getmSessionKey()); 
      MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create(); 
      entityBuilder.addPart("file_name", new FileBody(imageFile)); 
      entityBuilder.addPart("file_id", new StringBody(String.valueOf(fileId))); 
      entityBuilder.addPart("SessionKey", new StringBody(new SharedPrefDataSupplier(getApplicationContext()).getmSessionKey())); 
      HttpEntity entity = entityBuilder.build(); 
      httpPost.setEntity(entity); 
      HttpResponse response = httpClient.execute(httpPost, localContext); 
      StatusLine statusLine = response.getStatusLine(); 
      if (statusLine.getStatusCode() == 200) { 
       responseInputStream = response.getEntity().getContent(); 
       if (responseInputStream != null) { 
        Reader reader = new InputStreamReader(responseInputStream); 
        Gson gson = new GsonBuilder().create(); 
        MutipartImageUploadModel wResponse = gson.fromJson(reader, MutipartImageUploadModel.class); 
        Log.i(TAG, "Response " + wResponse); 
        try { 
         reader.close(); 
         responseInputStream.close(); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
        return wResponse; 
       } 
      } else { 
       Log.i(TAG, "Server responded with status code: " + statusLine.getStatusCode()); 
      } 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 

     } 
     return null; 
    } 
0

Если вы планируете отправить некоторые заголовки, маркеры доступа, печенье, то вы должны установить его в запрос свойств части, как:

// 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("file", fileName); 
      **conn.setRequestProperty("COOKIE_NAME_OR_TOKEN", mToken);** 
Смежные вопросы