将照片从 Android 应用上传到 Google Cloud Storage/App Engine - 非法字符“_”

2024-02-17

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

我感觉我真的很亲近。

这是我收到的错误消息:

com.google.appengine.repackaged.org.codehaus.jackson.JsonParseException: [来源:N/A; 行:-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();

}

提前致谢。


解决!

我有两个问题。

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

    String s = Base64.encodeToString(b, Base64.DEFAULT);

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

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

    GcsOutputChannel outputChannel = gcsService.createOrReplace(name, optionsBuilder.build());
    outputChannel.write(ByteBuffer.wrap(字节)); 输出通道.close();

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将照片从 Android 应用上传到 Google Cloud Storage/App Engine - 非法字符“_” 的相关文章

  • 使用正则表达式验证电子邮件的最大长度

    我找到了用于电子邮件验证的正则表达式 a z0 9 a z0 9 a z0 9 a z0 9 a z 2 4 我希望电子邮件的最大长度为 20 个字符 因此我将其更改为 a z0 9 a z0 9 a z0 9 a z0 9 a z 2 4
  • 在 doxygen 中使用 @see 或 @link

    我之前用 Javadoc 记录并使用了标签 see link or see foo and link foo 在我的描述中链接到其他课程 现在我尝试了doxygen 似乎这些标签不兼容 如果我运行 doxygen 完整的标签将被简单地解释为
  • 递归取消 allOf CompletableFuture

    如果我有 CompletableFuture
  • android gradle插件-离线安装

    我必须在离线电脑上安装 android gradle 插件 通过谷歌搜索 我了解到我可以通过本地 Maven 存储库来做到这一点 但从不成功的尝试和所有关于这个问题的质量保证中我知道这并不简单 我从来没有和maven一起工作过 有经验的人可
  • java:为什么主线程等待子线程完成

    我有一个简单的java程序 主线程 main 创建并启动另一个线程t class T extends Thread Override public void run while true System out println Inside
  • 是否可以创建 Java RAM 磁盘以与 java.io.* API 一起使用?

    我正在使用一个第三方库 它基本上创建一个输出目录 其中包含不同类型的文件和子目录 我希望能够编写单元测试来确认输出正确 我希望能够将库与 RAM 磁盘一起使用 这样库所做的任何事情都不会以任何方式接触实际的磁盘板 这个想法是让测试运行和清理
  • 生成一定长度的所有排列

    假设我们有一个字母表 abcdefghiklimnop 如何以有效的方式以五个一组的形式重复该字母表来递归生成排列 几天来我一直在为此苦苦挣扎 任何反馈都会有帮助 本质上这与 生成给定字符串的所有排列 https stackoverflow
  • java.exe 以非零退出值 1 结束

    只是为了开始 我并不是真正尝试从 Android 中的 xlsx 文件中读取单元格 我已经尝试了几乎所有我在 Google 上搜索到的内容 但是每次 在两台不同的 PC 上 都是 Java 1 7 0 79 当我尝试构建 运行 这个应用程序
  • 从字符串中删除重音符号

    Android 中有没有什么方法 据我所知 没有 java text Normalizer 可以从字符串中删除任何重音 例如 变成 eau 如果可能的话 我想避免解析字符串来检查每个字符 java text NormalizerAndroi
  • 我怎样才能实现CoverFlow视图[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想用点线布局实现溢出视图 目前我正在使用 polidea 封面流库 URL github https
  • 为休息服务实施 JUnit 测试

    我必须为我的休息服务实现一些 JUnit 测试 例如 这是我的休息服务之一 Path dni fe public class HelloWorld POST Path home Consumes MediaType APPLICATION
  • javadoc 子集/java 库组织

    我自己从来没有运行过javadoc 无论是在命令行还是ant 的 javadoc 任务 http ant apache org manual Tasks javadoc html 我将使用 ant 我需要为我编写的库生成 javadoc 问
  • 获取接收者的设备令牌以在 Firebase 中发送通知

    所以我正在学习如何使用 firebase 发送设备到设备的通知 我看到了这个answer https stackoverflow com a 42548586 5237289发送通知 看起来很简单 现在 我知道要获取发件人的令牌 它应该如下
  • 在 Eclipse RCP 应用程序中禁用插件贡献

    我经常遇到这个问题 但尚未找到解决方案 每当我编写一个新的基于 Eclipse RCP 的应用程序并包含来自 Eclipse 平台的插件时 我都会 继承 其中一些插件的 UI 贡献 大多数贡献 菜单项 键盘快捷键 属性页 都很有用 但有时我
  • Meteor:即使设置了 ANDROID_HOME 也未设置

    操作系统 Ubuntu 14 04 框架 流星1 1 0 2 应用名称 Songofy 这是输出meteor install sdk android meteor install sdk android Found Android bund
  • Java 8:如何创建毫秒、微秒或纳秒的 DateTimeFormatter?

    我需要创建格式化程序来解析具有可选的毫秒 微米或纳秒分数的时间戳 例如 对于我的需求 我看到以下机会 DateTimeFormatter formatter new DateTimeFormatterBuilder append DateT
  • 如何在不使用 -cp 开关的情况下在 Groovy 中自动加载数据库 jar?

    我想简化调用 Oracle 数据库的 Groovy 脚本的执行 如何将 ojdbc jar 添加到默认类路径以便我可以运行 groovy RunScript groovy 代替 groovy cp ojdbc5 jar RunScript
  • Spring MVC:通用 DAO 和服务类

    我正在 Spring MVC 中编写网页 我使用 Generic DAO 编写了所有 DAO 现在我想重写我的服务类 我该如何写 通用服务 我的 DAO 如下 DAO package net example com dao import j
  • 调用外部应用程序

    如何从我的应用程序调用外部应用程序 例如 我需要打电话Shazam 应用程序 来自我的应用程序 我可以在应用程序的包名称中看到logcat 这对任何目的都有用吗 特别是对于 Shazam 以下代码有效 Intent intent new I
  • Android:通过查找带有标签而不是 ID 的容器来添加片段

    我正在使用 for 循环创建片段的多个实例 在每个片段中 我需要添加另一组子片段 为此 我需要找到正确的容器 如果我使用容器的 ID 所有子片段都会添加到第一个父片段 而不是它们自己的父片段 在我的主要片段中 for ParentFragm

随机推荐