【问题标题】:Upload photos from Android app to Google Cloud Storage/App Engine - illegal character '_'将照片从 Android 应用上传到 Google Cloud Storage/App Engine - 非法字符“_”
【发布时间】:2014-03-28 13:26:15
【问题描述】:

我在将照片从我的 Android 应用程序上传到 GCS 时遇到问题。我可以上传文本文件,但不能上传照片。我尝试了各种 mime 类型以及不同的 Base64 编码方法(decodeBase64、encodeBase64URLSafeString 等...)

我觉得我真的很亲近。

这是我收到的错误消息:

com.google.appengine.repackaged.org.codehaus.jackson.JsonParseException: [来源:N/A;base64 内容中的非法字符“_”(代码 0x5f) 行:-1,列:-1]

我查看了编码后的字符串,里面没有任何“_”。

安卓代码:

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();

}

提前致谢。

【问题讨论】:

    标签: java android google-app-engine google-cloud-storage


    【解决方案1】:

    已解决!

    我有 2 个问题。

    1. 我对字符串的编码不正确。当我实际查看输出的 JSON 时,我可以看到字符串中有“_”。我通过添加行来解决这个问题

      字符串 s = Base64.encodeToString(b, Base64.DEFAULT);

    我之前尝试过,但图像仍然无法正常显示。

    1. 在上传到 GCS 之前,我没有将字节数组包装在 ByteBuffer 中:

      GcsOutputChannel outputChannel = gcsService.createOrReplace(name, optionsBuilder.build());
      outputChannel.write(ByteBuffer.wrap(bytes)); outputChannel.close();

    【讨论】:

    • 在找到您的邮递员之前,我在互联网上感到孤独,非常感谢。
    • 似乎生成的端点模型的方法 encodeXXX 内部使用 com.google.api.client.util.Base64.encodeBase64URLSafeString(byteData) 以某种方式设法创建无效的 base64 内容
    • 看起来您正在使用 android.util.Base64。如果 Java 7 使用 DatatypeConverter.printBase64Binary(bytes)。 Java 8 甚至有 java.util.Base64
    猜你喜欢
    • 2013-06-27
    • 2013-11-02
    • 1970-01-01
    • 2020-04-04
    • 2014-11-22
    • 2016-11-09
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多