尝试将文件上传到 Google 云存储时出现 FileNotFoundException

Getting FileNotFoundException when trying to upload File to Google Cloud Storage

我正在尝试将图像从 Android 上传到云存储。我正在关注 this official guide 如何使用 JSON API 将文件上传到 Google 云存储。这是我的代码

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";
    }


}

我正在使用 Public API 访问方法并将 Api 密钥附加到 link 就像 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.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.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)

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

我做了一些更改后就可以使用了。我收到了 401 Unauthorized Error 代码,这意味着我无权访问该存储桶。

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

然后,我向我的存储桶添加了 allUsers 权限(使其 public 供所有人读写)并且成功了。