允许用户使用 BlobstoreService 上传和保存文件到我的 GCS Bucket,如何识别上传的文件?

Allow users to upload and save file to my GCS Bucket using BlobstoreService, how to identify the uploaded files?

请help.I正在尝试使用 BlobstoreService 将视频文件 (.mp4) 上传到 GCS 存储桶。

文件已成功上传并自动保存在我的 GCS Bucket 中,客户端收到键 "upload_result" 的值 "YES"。
问题是我不知道如何识别 BlobstoreService 保存在我的存储桶中的上传文件,以及如何从请求中获取其他信息,例如“foo”和 'bar' 键值。

文档上说可以用BlobInfo#getGsObjectName()来获取名字,但是现在好像没有这个方法了。
我可以从请求中获取 'blobkey',但我认为它仅适用于 Blobstore 而不适用于 GCS。
是的,我可以得到原始文件名,但是原始文件名在GCS中丢失了,只有对象名。

com.google.appengine.api.blobstore.BlobInfo https://cloud.google.com/appengine/docs/java/javadoc/com/google/appengine/api/blobstore/BlobInfo.html#getGsObjectName--

///// JSP ///////
<%!
final String BUCKT_NAME = "my_bucket";
final long MAX_SIZE = 1024 * 1024 * 300;
String uploadURL;

BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
UploadOptions uploadOptions = UploadOptions.Builder
                               .withGoogleStorageBucketName(BUCKET_NAME)
                               .maxUploadSizeBytes(MAX_SIZE);
uploadURL = blobstoreService.createUploadUrl("/handler", uploadOptions);
%>


///// HTML Form ///////
<form id="file_upload_form" action="" method="post" enctype="multipart/form-data">
    <input type="file" name="uploaded_file">
    <button type="button">UPLOAD</button>
    <input type="hidden" name="foo" value="bar"> <-- I want to upload additional information with the video file.
</form>


///// ajax ///////

function uploadFile(){
    var fd = new FormData($('#file_upload_form').get(0));
    $.ajax({
        url: "<%=uploadURL %>",
        type: 'POST',
        data: fd,
        processData: false,
        contentType: false,
        dataType: 'json'
    })
        .done(function( data ) {
        if(data['upload_result'] == 'YES'){
            //Do sometihng
        }
        else{
            //Do something
        }
    });
}

///// SERVLET(Slim3 Controller) (/handler) ///////

private Navigation doPost() {
HttpServletRequest httpServletRequest = RequestLocator.get();
BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
Map<String, List<BlobKey>> blobs = blobstoreService.getUploads(httpServletRequest);
List<BlobKey> blobKeys = blobs.get("uploaded_file");
BlobKey fileKey = blobKeys.get(0);
BlobInfoFactory blobInfoFactory = new BlobInfoFactory();
BlobInfo blobInfo = blobInfoFactory.loadBlobInfo(fileKey);

String originalFileName = blobInfo.getFilename();
long filesize = blobInfo.getSize();
//String gcsObjectName = blobInfo.getGsObjectName(); <<-- Most important thing is not available.

if(blobKey!=null){
    String result = "{\"upload_result\":\"YES\"}";
        response.setCharacterEncoding("utf-8");
        response.setContentType("application/json");
        try {
            response.getWriter().println(result);
        } catch (IOException e) {
            e.printStackTrace();
        }
}
return null;

已编辑。 使用 FileInfo 而不是 BlobInfo 来获取生成的 GCS 对象名称。这是此案例的工作代码。

BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
Map<String, List<FileInfo>> fileInfos = blobstoreService.getFileInfos(request);
List<FileInfo> infos = fileInfos.get("uploaded_file");
FileInfo info = infos.get(0);
String gcsObjectName = info.getGsObjectName(); // <--

blob 键是 gcs 和 blobstore 的唯一标识符 - 此处有更多详细信息 https://cloud.google.com/appengine/docs/java/blobstore/#Java_Using_the_Blobstore_API_with_Google_Cloud_Storage。对于 gcs,您使用以下

BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
BlobKey blobKey = blobstoreService.createGsBlobKey(
    "/gs/" + fileName.getBucketName() + "/" + fileName.getObjectName());
blobstoreService.serve(blobKey, resp);