使用Java将包含文件的目录上载到S3

我正在处理用户将ZIP文件上传到我的服务器的应用程序,在ZIP文件将被扩展的服务器上,然后我需要将其上传到服务器。 现在我的问题是:如何使用Java到S3存储桶上传包含多个文件和子文件夹的目录? 那有什么例子吗? 目前我正在使用JetS3t管理我与S3的所有通信。

我建造的东西非常相似。 在服务器上展开zip后,调用FileUtils.listFiles(),它将递归列出文件夹中的文件。 只需迭代列表并创建s3objects并将文件上传到s3。 使用threadedstorage服务,以便可以同时上载多个文件。 还要确保您处理上传事件。 如果某些文件无法上传,jets3t库会告诉你。 我可以在进入办公室后发布我写的代码。

编辑:代码:

这是代码:

private static ProviderCredentials credentials; private static S3Service s3service; private static ThreadedS3Service storageService; private static S3Bucket bucket; private List s3Objs=new ArrayList(); private Set s3ObjsCompleted=new HashSet(); private boolean isErrorOccured=true; private final ByteFormatter byteFormatter = new ByteFormatter(); private final TimeFormatter timeFormatter = new TimeFormatter(); private void initialise() throws ServiceException, S3ServiceException { credentials=; s3service = new RestS3Service(credentials); bucket = new S3Bucket(); 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 filesinFolder=FileUtils.iterateFiles(folder,null,null); while(filesinFolder.hasNext()) { File file=filesinFolder.next(); String key = ; 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 s3ObjsRemaining=new ArrayList(); 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**************************"); } } } 

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