我无法将照片从我的Android应用上传到GCS。我可以上传文本文件而不上传照片。我尝试了各种mime类型以及不同的Base64编码方法(decodeBase64,encodeBase64URLSafeString等...)
我觉得我真的很亲密。
这是我收到的错误消息:
com.google.appengine.repackaged.org.codehaus.jackson.JsonParseException: base64内容中的非法字符'_'(代码0x5f)[来源:N / A; line:-1,column:-1]
我看了编码的字符串,那里没有'_'。
Android代码:
Activity:
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
switch (requestCode)
{
case 0:
{
try
{
InputStream is = getContentResolver().openInputStream(data.getData());
tvMessage.setText("Done!");
byte[] b = getBytes(is);
gaeTask task = new gaeTask();
PhotoObject p = new PhotoObject();
p.encodeBytes(b);
p.setName("picturejpg.jpg");
task.execute(p);
}
}
AsnycTask:
protected String doInBackground(PhotoObject... params)
{
String responseMessage = "";
try
{
PhotoObjectEndpoint builder = new PhotoObjectEndpoint(AndroidHttp.newCompatibleTransport(), new JacksonFactory(), new HttpRequestInitializer()
{
@Override
public void initialize(HttpRequest arg0) throws IOException
{
// TODO Auto-generated method stub
}
});
PhotoObject p = params[0];
builder.insertPhotoObject(p).execute();
responseMessage = p.getName() + " was successfully deployed.";
}
GAE / GCS代码:
GAE – PhotoObject:
@Entity
public class PhotoObject
{
public PhotoObject(){}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key key;
public Key getKey()
{
return key;
}
public void setKey(Key key)
{
this.key = key;
}
private String mBytes;
public byte[] getBytes()
{
return decodeBytes();
}
public void setBytes(byte[] mBytes)
{
this.mBytes = encodeBytes(mBytes);
}
private String name;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
private FileType type;
public FileType getType()
{
return type;
}
public void setType(FileType type)
{
this.type = type;
}
/**
*
* @see #getBytes()
* @return Base64 decoded value or {@code null} for none
*
* @since 1.14
*/
public byte[] decodeBytes()
{
return com.google.api.client.util.Base64.decodeBase64(mBytes);
}
/**
*
* @see #setBytes()
*
* <p>
* The value is encoded Base64 or {@code null} for none.
* </p>
*
* @since 1.14
*/
public String encodeBytes(byte[] bytes)
{
//this.mBytes = com.google.api.client.util.Base64.encodeBase64URLSafeString(bytes);
this.mBytes = com.google.api.client.util.Base64.encodeBase64String(bytes);
return this.mBytes;
}
}
GAE - insertPhotoObject:
try
{
final GcsService gcsService = GcsServiceFactory.createGcsService(RetryParams.getDefaultInstance());
GcsFilename name = new GcsFilename("testbucket123", fileName);
GcsFileOptions.Builder optionsBuilder = new GcsFileOptions.Builder();
optionsBuilder.mimeType("image/jpg");
GcsOutputChannel outputChannel = gcsService.createOrReplace(name, optionsBuilder.build());
ObjectOutputStream out = new ObjectOutputStream(Channels.newOutputStream(outputChannel));
out.write(bytes);
out.close();
}
提前致谢。
答案 0 :(得分:7)
解决!
我有两个问题。
我正在对字符串进行不正确的编码。当我实际查看输出的JSON时,我可以看到字符串中有“_”。我通过添加行
来修复此问题String s = Base64.encodeToString(b,Base64.DEFAULT);
之前我曾尝试过,但图片仍无法正常显示。
在上传到GCS之前,我没有将字节数组包装在ByteBuffer中:
GcsOutputChannel outputChannel = gcsService.createOrReplace(name,optionsBuilder.build());
outputChannel.write(ByteBuffer.wrap(字节));
outputChannel.close();