Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为Google云存储对象生成公共链接_Java_Google App Engine_Google Cloud Storage_Blobstore - Fatal编程技术网

Java 为Google云存储对象生成公共链接

Java 为Google云存储对象生成公共链接,java,google-app-engine,google-cloud-storage,blobstore,Java,Google App Engine,Google Cloud Storage,Blobstore,如何为用户通过BlobStore API提交的Google云存储对象生成公共链接?如何为Google云存储对象生成公共链接 通过手动创建服务帐户并生成.p12密钥文件。 用户将文件上载到使用以下命令生成的URL后: 处理/fileUploadingHandler的servlet可以检索GCS对象的文件名,并生成一个临时签名公共链接,如下所示: Map<String, List<FileInfo>> fileInfoMap = blobstoreService.getFil

如何为用户通过BlobStore API提交的Google云存储对象生成公共链接?

如何为Google云存储对象生成公共链接

通过手动创建服务帐户并生成.p12密钥文件。 用户将文件上载到使用以下命令生成的URL后: 处理/fileUploadingHandler的servlet可以检索GCS对象的文件名,并生成一个临时签名公共链接,如下所示:

Map<String, List<FileInfo>> fileInfoMap = blobstoreService.getFileInfos(request);
List<FileInfo> fileInfos = fileInfoMap.get("fileName");
FileInfo fileInfo = fileInfos.get(0);
String[] parts = fileInfo.getGsObjectName().split("/"); // get rid of /gs/buck_name/
String fileName = parts[parts.length - 1];
String signedUrl = GcsUrlSigner.generateSignedUrl(fileName);
// send the temporary public link (signedUrl) back to the user

如何为Google云存储对象生成公共链接

通过手动创建服务帐户并生成.p12密钥文件。 用户将文件上载到使用以下命令生成的URL后: 处理/fileUploadingHandler的servlet可以检索GCS对象的文件名,并生成一个临时签名公共链接,如下所示:

Map<String, List<FileInfo>> fileInfoMap = blobstoreService.getFileInfos(request);
List<FileInfo> fileInfos = fileInfoMap.get("fileName");
FileInfo fileInfo = fileInfos.get(0);
String[] parts = fileInfo.getGsObjectName().split("/"); // get rid of /gs/buck_name/
String fileName = parts[parts.length - 1];
String signedUrl = GcsUrlSigner.generateSignedUrl(fileName);
// send the temporary public link (signedUrl) back to the user

有几种方法可以为公共GCS对象提供服务。一个是签名URL。另一个是getServingUrl应用程序引擎方法

但是,如果对象应该对每个人都可见,您可以做一些更简单的事情。设置对象的权限以向AllUsers授予读取权限,从而允许在不进行任何身份验证的情况下读取对象,然后简单地将用户引用到以下路径:

就这样


您可以通过API或使用以下gsutil命令将对象设置为可从云控制台公开读取:gsutil acl ch-g alluser:R gs://BUCKET\u NAME/object\u NAME

为公共GCS对象提供服务有几种方法。一个是签名URL。另一个是getServingUrl应用程序引擎方法

但是,如果对象应该对每个人都可见,您可以做一些更简单的事情。设置对象的权限以向AllUsers授予读取权限,从而允许在不进行任何身份验证的情况下读取对象,然后简单地将用户引用到以下路径:

就这样


您可以通过API或使用以下gsutil命令将对象设置为可从云控制台公开读取:gsutil acl ch-g alluser:R gs://BUCKET\u NAME/object\u NAME

您知道BUCKET名称和对象名称吗,那么这些数据应该是公开访问的,还是只有一个特定的最终用户可以访问一次呢?@BrandonYarbrough我正在寻找一个永久链接和公开访问。然而,我读到了有关签名链接的信息,如下面我的回答所示,它对我很有效。但是,它有局限性吗?比如最大到期时间戳?或者我应该只在用户请求时生成签名链接吗?你知道bucket名称和对象名称吗?数据应该公开访问还是只由一个特定的最终用户访问一次?@BrandonYarbrough我正在寻找一个永久链接和公开访问。然而,我读到了有关签名链接的信息,如下面我的回答所示,它对我很有效。但是,它有局限性吗?比如最大到期时间戳?或者我应该只在用户请求时生成签名链接吗?谢谢分享您的答案。关于getServingUrl,它是ImagesService接口的一种方法,因此我假设它仅适用于图像。我想我会同意授予所有用户阅读权限。但是,我需要自动化权限授予,如何通过API实现这一点?您可以通过几种方式授予读取权限。我不确定您是如何创建这些对象的,但大多数方法都允许您在上载对象时为其指定ACL。您还可以指定将应用于bucket中上载对象的默认ACL。您还可以使用GCS API在对象上设置ACL。我试图为本地开发人员环境生成相同的ACL,我发现可以通过以下方式完成:http://localhost:8080/_ah/gcs//Now Firebase与Google云集成,我们如何设置Firebase与Firebase存储对象的动态链接?请看我的问题谢谢分享你的答案。关于getServingUrl,它是ImagesService接口的一种方法,因此我假设它仅适用于图像。我想我会同意授予所有用户阅读权限。但是,我需要自动化权限授予,如何通过API实现这一点?您可以通过几种方式授予读取权限。我不确定您是如何创建这些对象的,但大多数方法都允许您在上载对象时为其指定ACL。您还可以指定将应用于bucket中上载对象的默认ACL。您还可以使用GCS API在对象上设置ACL。我试图为本地开发人员环境生成相同的ACL,我发现可以通过以下方式完成:http://localhost:8080/_ah/gcs//Now Firebase与Google云集成,我们如何设置Firebase与Firebase存储对象的动态链接?请看我的问题
import com.google.api.client.util.Base64;

import java.io.InputStream;
import java.net.URLEncoder;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.Signature;

/**
 * Created by Fouad on 22-Dec-15.
 */
public class GcsUrlSigner
{
    private static final String DEFAULT_BUCKET_NAME = "XXXXXXXX.appspot.com";
    private static final String PUBLIC_URL_SERVICE_ACCOUNT_EMAIL = "XXXXXXXX@XXXXXX.iam.gserviceaccount.com";
    private static final String PUBLIC_URL_SERVICE_ACCOUNT_PKCS12_FILE_PATH = "XXXXXX.p12"; // located in the same folder as GcsUrlSigner.java
    private static final String PUBLIC_URL_SERVICE_ACCOUNT_PKCS12_FILE_PASSWORD = "notasecret";
    private static final long PUBLIC_URL_EXPIRATION_SECONDS = System.currentTimeMillis() / 1000 + 60; // 60 seconds

    public static String generateSignedUrl(String objectName) throws Exception
    {
        return generateSignedUrl(DEFAULT_BUCKET_NAME, objectName);
    }

    public static String generateSignedUrl(String bucketName, String objectName) throws Exception
    {
        PrivateKey key = loadKeyFromPkcs12(PUBLIC_URL_SERVICE_ACCOUNT_PKCS12_FILE_PATH, PUBLIC_URL_SERVICE_ACCOUNT_PKCS12_FILE_PASSWORD.toCharArray());
        return getSigningURL(key, "GET", PUBLIC_URL_EXPIRATION_SECONDS, bucketName, objectName);
    }

    private static String getSigningURL(PrivateKey key, String verb, long expirationSeconds, String bucketName, String objectName) throws Exception
    {
        String url_signature = signString(key, verb + "\n\n\n" + expirationSeconds + "\n" + "/" + bucketName + "/" + objectName);
        String signed_url = "https://storage.googleapis.com/" + bucketName + "/" + objectName +
                "?GoogleAccessId=" + PUBLIC_URL_SERVICE_ACCOUNT_EMAIL +
                "&Expires=" + expirationMillis +
                "&Signature=" + URLEncoder.encode(url_signature, "UTF-8");
        return signed_url;
    }

    private static PrivateKey loadKeyFromPkcs12(String filename, char[] password) throws Exception
    {
        InputStream is = GcsUrlSigner.class.getResourceAsStream(PUBLIC_URL_SERVICE_ACCOUNT_PKCS12_FILE_PATH);
        KeyStore ks = KeyStore.getInstance("PKCS12");
        ks.load(is, password);
        return (PrivateKey) ks.getKey("privatekey", password);
    }

    private static String signString(PrivateKey key, String stringToSign) throws Exception
    {
        if(key == null) throw new Exception("Private Key not initalized");

        Signature signer = Signature.getInstance("SHA256withRSA");
        signer.initSign(key);
        signer.update(stringToSign.getBytes("UTF-8"));

        byte[] rawSignature = signer.sign();

        return new String(Base64.encodeBase64(rawSignature), "UTF-8");
    }
}