2012-01-05 9 views
4

私はZIPファイルを自分のサーバーにアップロードするアプリケーションを開発しています。サーバー上でZIPファイルが展開され、サーバーにアップロードする必要があります。今私の質問は:どのようにS3バケットにJavaを使用して複数のファイルやサブフォルダを持つディレクトリをアップロードするには?それについての例はありますか?現在、私はJetS3tを使用してS3とのすべての通信を管理しています。Javaを使用してファイルにディレクトリをアップロードする

+2

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

答えて

3

私は非常に似たようなものを作りました。サーバー上でzipを展開した後、FileUtils.listFiles()を呼び出すと、フォルダ内のファイルを再帰的に一覧表示します。リストを繰り返してs3objectsを作成し、ファイルをs3にアップロードしてください。複数のファイルを同時にアップロードできるように、スレッドストレージサービスを利用する。また、アップロードイベントを処理するようにしてください。いくつかのファイルをアップロードできない場合は、jets3tライブラリから通知されます。 私が書いたコードを一度オフィスに入れることができます。

EDIT:CODE:

ここでは、コードです:

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。できます! 1つは、サブディレクトリを作成することです。それはすべてを平らにします。あなたはそれがなぜ起こっているのか考えていますか?あなたのコードはS3のサブディレクトリを作成していますか? もう1つ。あなたのコードでは、FileUtils.iterateFiles(folder、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