2016-05-22 3 views
0

Я пытаюсь загрузить изображение с Android в облачное хранилище. Я следую this official guide о том, как загружать файлы в Google Cloud Storage с помощью JSON API. Вот мой кодПолучение FileNotFoundException при попытке загрузить файл в 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"; 
    } 


} 

Я использую метод общественного доступа к API и добавление ключа Api в ссылке, как the guide says I could для авторизации запросов

Здесь ошибка я получаю

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) 

У меня нет подсказки, если это проблема на стороне клиента или на стороне сервера.

+0

'? Key = my_key' в вашем действительном коде это присвоено правильное значение или оно то же самое, что и это? – Yazan

+0

Я отредактировал его, у меня есть реальный ключ – kidustiliksew

ответ

1

У меня есть работа после внесения нескольких изменений. Я получаю 401 Несанкционированный код ошибки, что означает, что у меня не было разрешения на доступ к ведру.

Таким образом, вместо добавления параметра запроса key=api_key, я добавил access_token=auth_token для авторизации запросов.

Затем я добавил allUsers разрешение на мое ведро (что делает его общедоступным для всех, чтобы писать и читать), и это сработало.

Смежные вопросы