2016-05-22 3 views
0

Ich versuche ein Bild von Android auf Cloud Storage hochzuladen. Ich befolge this official guide zum Hochladen von Dateien in Google Cloud Storage mithilfe der JSON-API. Hier ist mein CodeAbrufen von FileNotFoundException beim Hochladen der Datei in Google Cloud Storage

private class uploadImage extends AsyncTask<File, Void, String> { 

    File file = mPhotoFile; 

    private String delimiter = "--"; 

    @Override 
    protected void onPreExecute() { 
     Toast.makeText(getActivity(), mPhotoFile.getPath(), Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    protected String doInBackground(File... params) { 


     try { 
      URL url = new URL("https://www.googleapis.com/upload/storage/v1/b/backend-images/o?uploadType=media&name=myObject?key=my_key"); 
      HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 

      urlConnection.setRequestMethod("POST"); 
      urlConnection.setChunkedStreamingMode(0); 
      urlConnection.setRequestProperty("Content-Type", "image/jpeg"); 
      urlConnection.setRequestProperty("Content-Length", String.valueOf(mPhotoFile.getPath().getBytes().length)); 
      urlConnection.setRequestProperty("Authorization", "my_key"); 
      urlConnection.setDoOutput(true); 
      urlConnection.setDoOutput(true); 


      OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream()); 
      InputStream responseStream = new BufferedInputStream(urlConnection.getInputStream()); 
      BufferedReader responseStreamReader = new BufferedReader(new InputStreamReader(responseStream)); 

      out.write(("Content-Type: image/jpeg\r\n").getBytes()); 
      out.write(("Content-Length: " + String.valueOf(mPhotoFile.getPath().getBytes().length)).getBytes()); 
      out.write("\r\n".getBytes()); 
      out.write(mPhotoFile.getPath().getBytes()); 
      out.write("\r\n".getBytes()); 

      String line = ""; 
      StringBuilder stringBuilder = new StringBuilder(); 

      while((line = responseStreamReader.readLine()) != null) { 
       stringBuilder.append(line).append("\n"); 
      } 

      String response = stringBuilder.toString(); 

      Log.i("CloudStorage", response); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return e.getMessage(); 
     } 

     return "Everything was a success"; 
    } 


} 

ich die öffentliche API-Zugriffsmethode verwenden und Anhängen des Api Schlüssel für den Link wie the guide says I could Anfragen zu autorisieren

Hier wird der Fehler ich erhalte

05-22 10:24:01.798 3747-4045/com.example.kid.uimockup W/System.err: java.io.FileNotFoundException:https://www.googleapis.com/upload/storage/v1/b/backend-images/o?uploadType=media&name=myObject?key=my_key 
05-22 10:24:01.798 3747-4045/com.example.kid.uimockup W/System.err: at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:197) 
05-22 10:24:01.798 3747-4045/com.example.kid.uimockup W/System.err:  at com.android.okhttp.internal.http.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210) 
05-22 10:24:01.798 3747-4045/com.example.kid.uimockup W/System.err:  at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:25) 
05-22 10:24:01.798 3747-4045/com.example.kid.uimockup W/System.err:  at com.example.kid.uimockup.HomeFragment$uploadImage.doInBackground(HomeFragment.java:636) 
05-22 10:24:01.803 3747-4045/com.example.kid.uimockup W/System.err:  at com.example.kid.uimockup.HomeFragment$uploadImage.doInBackground(HomeFragment.java:605) 
05-22 10:24:01.803 3747-4045/com.example.kid.uimockup W/System.err:  at android.os.AsyncTask$2.call(AsyncTask.java:288) 
05-22 10:24:01.803 3747-4045/com.example.kid.uimockup W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
05-22 10:24:01.803 3747-4045/com.example.kid.uimockup W/System.err:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
05-22 10:24:01.803 3747-4045/com.example.kid.uimockup W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
05-22 10:24:01.803 3747-4045/com.example.kid.uimockup W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
05-22 10:24:01.803 3747-4045/com.example.kid.uimockup W/System.err:  at java.lang.Thread.run(Thread.java:818) 

Ich habe keine Ahnung, ob dies ein Problem auf der Client-Seite oder der Server-Seite ist

+0

'? Key = my_key' in Ihrem realen Code ist dies ein richtiger Wert zugeordnet oder es ist das gleiche wie das? – Yazan

+0

Ich habe es bearbeitet, ich habe den richtigen Schlüssel – kidustiliksew

Antwort

1

Ich habe es funktioniert nach ein paar Änderungen. Ich erhielt einen 401-Code, der nicht autorisiert ist, was bedeutet, dass ich keine Berechtigung zum Zugriff auf den Bucket hatte.

Anstatt den Abfrageparameter key=api_key anzuhängen, fügte ich access_token=auth_token an, um Anfragen zu autorisieren.

Ich fügte dann allUsers Erlaubnis zu meinem Eimer hinzu (es öffentlich für jeden machend, um zu schreiben und zu lesen) und es funktionierte.

Verwandte Themen