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.