【问题标题】:Getting FileNotFoundException when trying to upload File to Google Cloud Storage尝试将文件上传到 Google Cloud Storage 时出现 FileNotFoundException
【发布时间】:2016-05-22 07:47:20
【问题描述】:

我正在尝试将图像从 Android 上传到云存储。我正在关注this official guide,了解如何使用 JSON API 将文件上传到 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)

我不知道这是客户端还是服务器端的问题

【问题讨论】:

  • ?key=my_key 在您的真实代码中,这是分配了正确的值还是与此相同?
  • 我编辑了,我有真正的钥匙

标签: java android http google-cloud-storage


【解决方案1】:

做了一些改动后,我得到了它的工作。我收到 401 Unauthorized Error 代码,这意味着我没有访问存储桶的权限。

所以我没有附加查询参数key=api_key,而是附加了access_token=auth_token 来授权请求​​。

然后我向我的存储桶添加了allUsers 权限(将其公开以供所有人读写)并且它起作用了。

【讨论】:

    猜你喜欢
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 2021-01-05
    • 2019-04-02
    • 2023-03-11
    • 2019-06-04
    相关资源
    最近更新 更多