2017-01-31 12 views
0

Пожалуйста, помогите. Я пытаюсь загрузить видеофайл (.mp4) в ковш GCS с помощью BlobstoreService.Разрешить пользователям загружать и сохранять файл в мой GCS Bucket с помощью BlobstoreService, как идентифицировать загруженные файлы?

Файл успешно загружен и сохранен автоматически в моем ковке GCS, а клиент получил значение «ДА» для ключа «upload_result».
Проблема заключается в том, что я не знаю, как идентифицировать загруженный файл, сохраненный в моем блоке, BlobstoreService и как получить другие данные, такие как «foo'and» bar «key-value» из запроса.

В документе говорится, что я могу использовать 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(); // <-- 

ответ

0

Ключ блоб является уникальным идентификатором для обоих ГКС и 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); 
+1

Решено. В этом случае я должен использовать «FileInfo» вместо «BlobInfo» в моем обработчике. –