Java 如何使用谷歌云存储正确上传和服务图像?

Java 如何使用谷歌云存储正确上传和服务图像?,java,image,google-app-engine,struts2,google-cloud-storage,Java,Image,Google App Engine,Struts2,Google Cloud Storage,我已经在这个问题上纠缠了几天,但都没有取得任何成功,所以我认为是时候伸出援手了 我在jsp中有一个表单,它是使用Struts2运行的Google App Engine web应用程序的一部分。我的用例是,应该使用此表单将“磁贴”上载到后端存储。表单包含文本字段、复选框和文件字段,用于上载表示互动程序的图像(对于上下文,互动程序用于游戏)。 文本/布尔字段将对象化为一个“平铺”实体,并存储在谷歌数据存储中,该数据存储当前功能正常,工作正常,图像文件将上载到谷歌云存储并保存在一个存储桶中。然而,我的

我已经在这个问题上纠缠了几天,但都没有取得任何成功,所以我认为是时候伸出援手了

我在jsp中有一个表单,它是使用Struts2运行的Google App Engine web应用程序的一部分。我的用例是,应该使用此表单将“磁贴”上载到后端存储。表单包含文本字段、复选框和文件字段,用于上载表示互动程序的图像(对于上下文,互动程序用于游戏)。 文本/布尔字段将对象化为一个“平铺”实体,并存储在谷歌数据存储中,该数据存储当前功能正常,工作正常,图像文件将上载到谷歌云存储并保存在一个存储桶中。然而,我的问题在于图像上传

我尝试了几种方法,但都没有成功,但最近的一种方法是使用Storage.Objects资源将流上载到存储。我目前使用Spring将表单内容合并到一个“Tile”bean中,该bean包含所有字段,包括图像文件(该文件当前存储为com.google.appengine.api.datastore.Blob,它属于不同的api,实际上可能是问题的原因,但我似乎找不到替代存储)。 提交时,我的操作将这个tile对象传递给DAO,提取Blob,并将tile(没有图像Blob)持久化到数据存储中。这部分很好用。然后,我从图像Blob中提取字节,并围绕它们构建一个输入流,然后将该流输出到存储器

public void storeTileImageToStorage(Blob imageData, String fileName) throws FileNotFoundException, IOException, GeneralSecurityException {

        ByteArrayInputStream bis = new ByteArrayInputStream(imageData.getBytes());

        uploadStreamToStorage(fileName, "image/png", bis, bucketName);
    }


public static void uploadStreamToStorage(
            String name, String contentType, InputStream stream, String bucketName)
            throws IOException, GeneralSecurityException
    {
        InputStreamContent contentStream = new InputStreamContent(contentType, stream);

        StorageObject objectMetadata = new StorageObject()
                // Set the destination object name
                .setName(name).setContentType(contentType);

        // Do the insert
        Storage client = getStorageService();
        Storage.Objects.Insert insertRequest = client.objects().insert(
                bucketName, objectMetadata, contentStream);

        insertRequest.execute();
    }
这在某些方面起作用,因为在bucket中创建了具有正确名称(和文件大小)的新对象。然而,当我尝试使用web客户端打开图像时,我会看到一个小的白色框,而不是实际的图像(见下文)。以编程方式为映像提供服务的任何尝试也会失败

编辑:根据请求,我用于检索图像的代码。虽然我不认为这有什么关系,但当我在云存储web客户端中单击文件时,会出现“白框”,而不是当我尝试以编程方式为图像提供服务时

编辑2:再看一遍这段代码,我意识到这是行不通的,因为.get()和cast to Blob将无法按我的意愿工作。但是,不管服务代码目前不是我的问题,到目前为止,存储中文件本身的格式是我的问题

public Blob retrieveTileImageFromStorage(String tileName) throws IOException, GeneralSecurityException {
        StorageObject object = getObjectFromStorageBucket(bucketName, tileName);
        Blob image = (Blob)object.get(tileName);

        return image;
    }

public static StorageObject getObjectFromStorageBucket(String bucketName, String objectName)
            throws IOException, GeneralSecurityException {
        Storage client = getStorageService();
        Storage.Objects.Get get = client.objects().get(bucketName, objectName);

        StorageObject object = get.execute();

        return object;
    }
我假设会有一个解决方案,我会犯一个愚蠢的错误,因为文件大小是正确的,这意味着上传确实有效。我只是在将文件作为图像查看时遇到问题。 有人能解释一下情况吗?
提前感谢。

如何提供图像?检索和显示图像时使用的操作和jsp是什么?!我将添加用于检索图像的代码,但问题发生在检索之前,因为当我单击云存储本身中的文件时会显示“白框”,而不是当我尝试以编程方式为图像提供服务时。您能否提供一个链接以下载将上载的示例磁贴副本以及相应的“白色广场“图像文件?作为另外一个问题,您如何接受文件上传的tile字节?我无法从提供的代码和信息中确定这可能是什么原因。您发布的图像是真实图像还是屏幕截图的一部分?没有更多的信息很难提供帮助,尽管您已经提供了大量令人钦佩的信息。您如何为图像提供服务?您用于检索和显示图像的操作和jsp是什么?!我将添加用于检索图像的代码,但问题发生在检索之前,因为当我单击云存储本身中的文件时会显示“白框”,而不是当我尝试以编程方式为图像提供服务时。您能否提供一个链接以下载将上载的示例磁贴副本以及相应的“白色广场“图像文件?作为另外一个问题,您如何接受文件上传的tile字节?我无法从提供的代码和信息中确定这可能是什么原因。您发布的图像是真实图像还是屏幕截图的一部分?没有更多的信息很难提供帮助,尽管事实上你已经提供了很多令人钦佩的信息。