繁体   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