2017-01-31 2 views
0

Bitte help.I versuchen, Videodatei (. Mp4) in GCS-Bucket mit BlobstoreService hochzuladen.Benutzern erlauben, Dateien mit BLOBSTOREService in meinen GCS-Bucket hochzuladen und zu speichern. Wie können die hochgeladenen Dateien identifiziert werden?

Die Datei wurde erfolgreich hochgeladen und automatisch in meinem GCS-Bucket gespeichert, und der Client erhielt den Wert "YES" für den Schlüssel "upload_result".
Das Problem ist, dass ich nicht weiß, wie die hochgeladene Datei in meinem Bucket von BlobstoreService zu identifizieren und wie andere Informationen wie "foo" und "bar" Schlüssel-Wert aus der Anfrage erhalten.

Dokument besagt, dass ich BlobInfo # getGsObjectName() verwenden kann, um den Namen abzurufen, aber es scheint, dass die Methode jetzt nicht verfügbar ist.
Ich kann den 'Blobkey' von der Anfrage bekommen, aber ich denke, es funktioniert nur für den Blobstore und nicht für GCS.
Ja, ich kann den ursprünglichen Dateinamen erhalten, aber der ursprüngliche Name ist in GCS verloren und der Objektname ist die einzige Sache.

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; 

EDITED. Verwenden Sie FileInfo anstelle von BlobInfo, um den generierten GCS-Objektnamen abzurufen. Hier ist der Arbeitscode für diesen Fall.

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

Antwort

0

Der Blob-Schlüssel ist die eindeutige Kennung für beide GCS und Blobstore - mehr Details hier https://cloud.google.com/appengine/docs/java/blobstore/#Java_Using_the_Blobstore_API_with_Google_Cloud_Storage. Für GCs verwenden Sie die folgenden

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

Gelöst. In diesem Fall sollte ich "FileInfo" anstelle von "BlobInfo" in meinem Handler verwenden. –

Verwandte Themen