2012-01-05 2 views
4

Я работаю над приложением, где пользователь будет загружать ZIP-файл на мой сервер, на сервере будет расшифрован ZIP-файл, а затем мне нужно загрузить его на сервер. Теперь мои вопросы: как загрузить каталог с несколькими файлами и подпапками с помощью Java в S3? Есть ли примеры для этого? В настоящее время я использую JetS3t для управления всеми своими сообщениями с S3.Загрузить каталог с файлами на S3 с помощью Java

+2

http://jets3t.s3.amazonaws.com/toolkit/code-samples.html#uploading –

ответ

3

Я построил нечто очень похожее. После расширения zip на сервере вызовите FileUtils.listFiles(), который будет рекурсивно отображать файлы в папке. Просто переберите список и создайте s3объекты и загрузите файлы на s3. Используйте службу threadedstorage, чтобы одновременно загружать несколько файлов. Также убедитесь, что вы обрабатываете события загрузки. Если некоторые файлы не могут быть загружены, вам сообщит библиотека jets3t. Я мог бы опубликовать код, который я написал, однажды попав в офис.

EDIT: КОД:

Вот код:

private static ProviderCredentials credentials; 
private static S3Service s3service; 
private static ThreadedS3Service storageService; 
private static S3Bucket bucket; 
private List<S3Object> s3Objs=new ArrayList<S3Object>(); 
private Set<String> s3ObjsCompleted=new HashSet<String>(); 
private boolean isErrorOccured=true; 
private final ByteFormatter byteFormatter = new ByteFormatter(); 
private final TimeFormatter timeFormatter = new TimeFormatter(); 


    private void initialise() throws ServiceException, S3ServiceException { 
    credentials=<create your credentials>; 
     s3service = new RestS3Service(credentials); 
     bucket = new S3Bucket(<bucket details>); 
     storageService=new ThreadedS3Service(s3service, this); 
    } 
} 

private void uploadFolder(File folder) throws NoSuchAlgorithmException, IOException { 
    readFolderContents(folder); 
    uploadFilesInList(folder); 
} 
private void readFolderContents(File folder) throws NoSuchAlgorithmException, IOException { 
    Iterator<File> filesinFolder=FileUtils.iterateFiles(folder,null,null); 

    while(filesinFolder.hasNext()) { 
     File file=filesinFolder.next(); 
     String key = <create your key from the filename or something>; 
     S3Object s3Obj=new S3Object(bucket, file); 
     s3Obj.setKey(key); 
     s3Obj.setContentType(Mimetypes.getInstance().getMimetype(s3Obj.getKey())); 
     s3Objs.add(s3Obj); 
    } 
} 
private void uploadFilesInList(File folder) { 
    logger.debug("Uploading files in folder "+folder.getAbsolutePath()); 
    isErrorOccured=false; 
    s3ObjsCompleted.clear(); 

    storageService.putObjects(bucket.getName(), s3Objs.toArray(new S3Object[s3Objs.size()])); 

    if(isErrorOccured || s3Objs.size()!=s3ObjsCompleted.size()) { 
     logger.debug("Have to try uploading a few objects again for folder "+folder.getAbsolutePath()+" - Completed = "+s3ObjsCompleted.size()+" and Total ="+s3Objs.size()); 
     List<S3Object> s3ObjsRemaining=new ArrayList<S3Object>(); 
     for(S3Object s3Obj : s3Objs) { 
      if(!s3ObjsCompleted.contains(s3Obj.getKey())) { 
       s3ObjsRemaining.add(s3Obj); 
      } 
     } 
     s3Objs=s3ObjsRemaining; 
     uploadFilesInList(folder); 
    } 
} 

@Override 
public void event(CreateObjectsEvent event) { 
    super.event(event); 
    if (ServiceEvent.EVENT_IGNORED_ERRORS == event.getEventCode()) { 
     Throwable[] throwables = event.getIgnoredErrors(); 
     for (int i = 0; i < throwables.length; i++) { 
      logger.error("Ignoring error: " + throwables[i].getMessage()); 
     } 
    }else if(ServiceEvent.EVENT_STARTED == event.getEventCode()) { 
     logger.debug("**********************************Upload Event Started***********************************"); 
    }else if(event.getEventCode()==ServiceEvent.EVENT_ERROR) { 
     isErrorOccured=true; 
    }else if(event.getEventCode()==ServiceEvent.EVENT_IN_PROGRESS) { 
     StorageObject[] storeObjs=event.getCreatedObjects(); 
     for(StorageObject storeObj : storeObjs) { 
      s3ObjsCompleted.add(storeObj.getKey()); 
     } 
     ThreadWatcher watcher = event.getThreadWatcher(); 
     if (watcher.getBytesTransferred() >= watcher.getBytesTotal()) { 
      logger.debug("Upload Completed.. Verifying"); 
     }else { 
      int percentage = (int) (((double) watcher.getBytesTransferred()/watcher.getBytesTotal()) * 100); 

      long bytesPerSecond = watcher.getBytesPerSecond(); 
      StringBuilder transferDetailsText=new StringBuilder("Uploading.... "); 
      transferDetailsText.append("Speed: " + byteFormatter.formatByteSize(bytesPerSecond) + "/s"); 

      if (watcher.isTimeRemainingAvailable()) { 
       long secondsRemaining = watcher.getTimeRemaining(); 
       if (transferDetailsText.length() > 0) { 
        transferDetailsText.append(" - "); 
       } 
       transferDetailsText.append("Time remaining: " + timeFormatter.formatTime(secondsRemaining)); 
      } 

      logger.debug(transferDetailsText.toString()+" "+percentage); 
     } 
    }else if(ServiceEvent.EVENT_COMPLETED==event.getEventCode()) { 
     logger.debug("**********************************Upload Event Completed***********************************"); 
     if(isErrorOccured) { 
      logger.debug("**********************But with errors, have to retry failed uploads**************************"); 
     } 
    } 
} 
+0

Благодаря Sethu. Оно работает! одна вещь, которая не работает, - это создание подкаталогов. То, что он делает, делает все плоской. Вы не знаете, почему это происходит? Создает ли ваш код подкаталоги в вашем S3? Еще одна вещь. В вашем коде мне пришлось изменить FileUtils.iterateFiles (папка, null, null); в FileUtils.iterateFiles (папка, null, true); – Maksim

+1

О, неважно. Я просто понял, что ключ файла будет иметь каталог (например, images/image.jpg). Вот что я сделал в своем коде: file.getAbsolutePath(). ReplaceAll (filePath + "/", ""); – Maksim

6

HI Это простой способ, чтобы загрузить каталог в S3 ведро.

BasicAWSCredentials awsCreds = new BasicAWSCredentials(access_key_id, 
      secret_access_key); 
    AmazonS3 s3Client = new AmazonS3Client(awsCreds); 

    TransferManager tm = new TransferManager(s3Client); 


    MultipleFileUpload upload = tm.uploadDirectory(existingBucketName, 
      "BuildNumber#1", "FilePathYouWant", true); 
+0

** Видеопоток ** 'FileInputStream stream = новый FileInputStream (vedio_filepath); \t ObjectMetadata objectMetadata = new ObjectMetadata(); \t PutObjectRequest putObjectRequest = new PutObjectRequest ( \t s3_BucketName, location_KEY, stream, objectMetadata); ' – Yash

Смежные вопросы