簡體   English   中英

在Android中使用帶有HttpURLConnection的Blobstore API上傳到Google Cloud Storage

[英]upload to Google Cloud Storage using Blobstore API with HttpURLConnection in Android

我有一個Endpoints API方法,可以為我提供一個到Google Cloud Storage的上傳URL,如下所示:

@ApiMethod(name = "getUploadUrl", path = "get_upload_url", httpMethod = ApiMethod.HttpMethod.POST)
    public CollectionResponse<String> getUploadUrl(@Named("objectName")String objectName){

        BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
        String callbackUrl = "/handleupload";
        String uploadUrl = blobstoreService.createUploadUrl(callbackUrl,
                UploadOptions.Builder.withGoogleStorageBucketName("my-bucket"));

        ArrayList<String> results = new ArrayList<>(1);
        results.add(uploadUrl);
        return CollectionResponse.<String>builder().setItems(results).build();
    }

這將成功返回一個URL,供我將圖像文件上傳到該URL。

在Android中,我嘗試像這樣上傳文件:

private Boolean uploadImage(File file, String uploadUrl){
        try {
            long bytes = file.length();

            URL url = new URL(uploadUrl);
            HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
            urlConnection.setRequestMethod("POST"); 
            urlConnection.setDoInput(true);
            urlConnection.setDoOutput(true);
            urlConnection.setRequestProperty("Connection", "Keep-Alive");
            urlConnection.setRequestProperty("Content-Type", "image/jpg");

            DataOutputStream outputStream = new DataOutputStream(urlConnection.getOutputStream());

            int bytesAvailable = 0;
            FileInputStream fileInputStream = null;
            try {
                fileInputStream = new FileInputStream(file);
                bytesAvailable = fileInputStream.available();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                return false;
            }

            int maxBufferSize = 1024;
            int bufferSize = Math.min(bytesAvailable, maxBufferSize);
            byte[ ] buffer = new byte[bufferSize];

            int bytesRead = fileInputStream.read(buffer, 0, bufferSize);

            while (bytesRead > 0)
            {
                outputStream.write(buffer, 0, bufferSize);
                bytesAvailable = fileInputStream.available();
                bufferSize = Math.min(bytesAvailable,maxBufferSize);
                bytesRead = fileInputStream.read(buffer, 0,bufferSize);
            }
            int responseCode = urlConnection.getResponseCode();

            fileInputStream.close();
            outputStream.flush();
            outputStream.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

        return false;
    }

但是我得到了400 Bad Request的響應。 我想我做錯了。

我想使用HttpURLConnection類,因為Android在HttpClient推薦它(大多數SO帖子都提供了示例): http : //android-developers.blogspot.com/2011/09/androids-http-clients.html

我正在使用blobstore api上傳圖像而不是Google Cloud Storage簽名URL,因為我可以在服務器端獲取回調來處理上傳。

我自己從未嘗試過,所以我不是100%確信。 但是,公共文檔確實建議該請求必須“包括文件上載字段,並且表單的enctype必須設置為multipart / form-data”。 有許多示例顯示了如何使用HttppUrlConnection發送此類請求。 (這是一個示例 ,盡管請確保使用“文件”而不是“文件名”)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM