如何在android中将图像上传到谷歌云存储?

如何在android中将图像上传到谷歌云存储?,android,google-cloud-storage,retrofit,Android,Google Cloud Storage,Retrofit,我正在尝试在我的应用程序中将图像上传到谷歌云存储。 我有一个工作的web解决方案,所以我可以看到请求的所有信息。 这里是工作web解决方案的原始请求 POST /_ah/upload/AMmfu6YbDgVL5B8ZYIBs9VQcZElIKyvHBOG0g-Y3PDsBiVgQLFZNKdzmV-G9gYF3e9SnFUNWCOSP6KDgO5f9bAxkDyNiMeY5EzXW9uWK9ULqXoQostoWySSQkKSzbizJbmjOH1x6mHOkYyWe3kKCn_84qp

我正在尝试在我的应用程序中将图像上传到谷歌云存储。 我有一个工作的web解决方案,所以我可以看到请求的所有信息。 这里是工作web解决方案的原始请求

    POST /_ah/upload/AMmfu6YbDgVL5B8ZYIBs9VQcZElIKyvHBOG0g-Y3PDsBiVgQLFZNKdzmV-G9gYF3e9SnFUNWCOSP6KDgO5f9bAxkDyNiMeY5EzXW9uWK9ULqXoQostoWySSQkKSzbizJbmjOH1x6mHOkYyWe3kKCn_84qpc1UhUNkw/ALBNUaYAAAAAVwOltAcWY8y-iHPujyHYUBbhmQlwJyi-/ HTTP/1.1
Host: taxi2deal.appspot.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: */*
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
X-Requested-With: XMLHttpRequest
Referer: http://taxi2deal.appspot.com/
Content-Length: 2718
Content-Type: multipart/form-data; boundary=---------------------------5607231118094935911642858770
Connection: keep-alive

-----------------------------5607231118094935911642858770
Content-Disposition: form-data; name="myFile[]"; filename="ic_uploadphoto.png"
Content-Type: image/png

�PNG


IHDR*$�ɨ+tEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c067 79.157747, 2015/03/30-23:40:42        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2015 (Macintosh)" xmpMM:InstanceID="xmp.iid:3B13B96FF1F811E599F4BCD9FCA860E7" xmpMM:DocumentID="xmp.did:3B13B970F1F811E599F4BCD9FCA860E7"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:3B13B96DF1F811E599F4BCD9FCA860E7" stRef:documentID="xmp.did:3B13B96EF1F811E599F4BCD9FCA860E7"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>KB3�'IDATx��XkHW7�#h��k��V��i�D��BHZ��H�X�%�Ph�
-----------------------------5607231118094935911642858770--
这是我使用改型的请求API

 @Multipart
    @POST("/_ah/upload/{key}")
    void imageUpload(@EncodedPath("key") String key,@Part("photo") TypedFile photoFile,Callback<List<ImageUploadResponse>> callback);
@Multipart
@POST(“/_-ah/upload/{key}”)
void imageUpload(@EncodedPath(“key”)字符串键,@Part(“photo”)类型文件照片文件,回调);
这就是请求实现

TypedFile photoTypedFile = new TypedFile("image/*", imageFileName);
                    TypedString name = new TypedString("testName");


                    service.imageUpload(key, photoTypedFile, new Callback<List<ImageUploadResponse>>() {
                        @Override
                        public void success(List<ImageUploadResponse> imageUploadResponses, Response response) {
                            Log.d("SignUpActivity", "Status Code = " + response.getStatus());
                            Log.d("SignUpActivity", "response = " + new Gson().toJson(response));
                            if (response.getStatus() < 400) {
                                // request successful (status code 200, 201)
                                ImageUploadResponse result = imageUploadResponses.get(0);
                                Log.d("SignUpActivity", "response = " + new Gson().toJson(result));
                                Toast.makeText(getApplicationContext(), result.imageUrl, Toast.LENGTH_SHORT).show();
                                Log.d("SignUpActivity", "ImagUrl = " + result.imageUrl);
                            }
                        }

                        @Override
                        public void failure(RetrofitError error) {
                            Log.d("SignUpActivity", error.toString());
                        }
                    });
TypedFile photoTypedFile=新的TypedFile(“image/*”,imageFileName);
TypedString名称=新的TypedString(“testName”);
service.imageUpload(key,photoTypedFile,newcallback(){
@凌驾
public void成功(列出imageUploadResponses、ResponseResponse){
Log.d(“注册活动”、“状态代码=“+response.getStatus());
Log.d(“SignUpActivity”,“response=“+new Gson().toJson(response));
if(response.getStatus()<400){
//请求成功(状态代码200201)
ImageUploadResponse结果=imageUploadResponses.get(0);
Log.d(“SignUpActivity”,“response=“+new Gson().toJson(result));
Toast.makeText(getApplicationContext(),result.imageUrl,Toast.LENGTH_SHORT.show();
Log.d(“SignUpActivity”、“ImagUrl=“+result.imageUrl”);
}
}
@凌驾
公共无效失败(错误){
Log.d(“SignUpActivity”,error.toString());
}
});

所以,问题是,尽管有200个Ok响应,我的身体还是空的。 几个小时后,我注意到,我需要在身体中使用特殊的
name

Content-Disposition: form-data; name="news_file"; filename="news.txt"\r\n
在此之前,我使用了随机名称,它是test、abc等。这个名称是表单的名称,所以它应该是表单的名称,而不是您想要的名称。希望这能帮助别人

在安卓系统中,应该是这样的。我使用改装

  @Multipart
    @POST("/_ah/upload/{key}")
    void imageUpload(@EncodedPath("key") String key, @Part("news_file") TypedFile photoFile,Callback<List<ImageUploadResponse>> callback);
@Multipart
@POST(“/_-ah/upload/{key}”)
void imageUpload(@EncodedPath(“key”)字符串键,@Part(“news_file”)类型文件照片文件,回调);
看一看,
@Part
与名称相同(例如
news\u file

  @Multipart
    @POST("/_ah/upload/{key}")
    void imageUpload(@EncodedPath("key") String key, @Part("news_file") TypedFile photoFile,Callback<List<ImageUploadResponse>> callback);