[英]Sending file to blob only works when function is called in while loop
I have the Azure blob sample code which I'm trying to modify. 我有要修改的Azure blob示例代码。 However, the uploadFile function only works when it is in the while loop in a switch case.
但是,uploadFile函数仅在开关情况下处于while循环中时才起作用。 If I take it out of the loop, it creates the container but fails to upload the file.
如果我退出循环,它将创建容器,但无法上传文件。
I've tried taking it out and calling the function from different places in the code, but none of them work. 我尝试将其取出并从代码中的不同位置调用该函数,但是它们都不起作用。
uploadFile function: uploadFile函数:
static void uploadFile(BlockBlobURL blob, File sourceFile) throws IOException {
AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(sourceFile.toPath());
// Uploading a file to the blobURL using the high-level methods available in TransferManager class
// Alternatively call the PutBlob/PutBlock low-level methods from BlockBlobURL type
TransferManager.uploadFileToBlockBlob(fileChannel, blob, 8*1024*1024, null, null)
.subscribe(response-> {
System.out.println("Completed upload request.");
TimeUnit.SECONDS.sleep(5);
System.out.println(response.response().statusCode());
});
}
Relevant part of main 主要相关部分
// Listening for commands from the console
//THIS IS THE PART THAT ONLY MAKES THE CONTAINER
/*
System.out.println("Uploading the sample file into the container: " + containerURL );
uploadFile(blobURL, sampleFile);
System.out.println("File Uploaded");
*/
//TRYING TO CALL FUNCTION FROM OUTSIDE WHILE, BUT IT ONLY WORKS HERE
System.out.println("Enter a command");
System.out.println("(P)utBlob | (L)istBlobs | (G)etBlob");
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.println("# Enter a command : ");
String input = reader.readLine();
switch(input){
case "P":
System.out.println("Uploading the sample file into the container: " + containerURL );
uploadFile(blobURL, sampleFile);
break;
The uploadFile called outside of the while loop creates the container but doesn't actually upload a file to the blob, while uploadFile from in the while loop and switch case does 在while循环外部调用的uploadFile创建了容器,但实际上并未将文件上传到blob,而while循环和switch情况下的uploadFile确实可以
This won't upload the blob because the upload process has not finished and the main process has finished. 由于上传过程尚未完成且主过程已完成,因此不会上传Blob。 So I just add a
Thread.sleep()
to the main process. 因此,我只是将
Thread.sleep()
添加到主进程中。 And reminder don't set the value too short or it still fails. 并且提醒不要将值设置得太短,否则仍然会失败。 In my test I set it to
2000
millisecond. 在我的测试中,我将其设置为
2000
毫秒。
public static void main(String[] args) throws java.lang.Exception{
ContainerURL containerURL;
// Creating a sample file to use in the sample
File sampleFile = null;
try {
sampleFile = File.createTempFile("downloadedFile", ".txt");
// Retrieve the credentials and initialize SharedKeyCredentials
String accountName = "xxxxxx";
String accountKey = "xxxxxxx";
// Create a ServiceURL to call the Blob service. We will also use this to construct the ContainerURL
SharedKeyCredentials creds = new SharedKeyCredentials(accountName, accountKey);
// We are using a default pipeline here, you can learn more about it at https://github.com/Azure/azure-storage-java/wiki/Azure-Storage-Java-V10-Overview
final ServiceURL serviceURL = new ServiceURL(new URL("https://" + accountName + ".blob.core.windows.net"), StorageURL.createPipeline(creds, new PipelineOptions()));
// Let's create a container using a blocking call to Azure Storage
// If container exists, we'll catch and continue
containerURL = serviceURL.createContainerURL("quickstart");
try {
ContainerCreateResponse response = containerURL.create(null, null, null).blockingGet();
System.out.println("Container Create Response was " + response.statusCode());
} catch (RestException e){
if (e instanceof RestException && ((RestException)e).response().statusCode() != 409) {
throw e;
} else {
System.out.println("quickstart container already exists, resuming...");
}
}
// Create a BlockBlobURL to run operations on Blobs
final BlockBlobURL blobURL = containerURL.createBlockBlobURL("SampleBlob.txt");
System.out.println("Uploading the sample file into the container: " + containerURL );
AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(sampleFile.toPath());
// Uploading a file to the blobURL using the high-level methods available in TransferManager class
// Alternatively call the PutBlob/PutBlock low-level methods from BlockBlobURL type
TransferManager.uploadFileToBlockBlob(fileChannel, blobURL, 8*1024*1024, null, null)
.subscribe(response-> {
System.out.println("Completed upload request.");
System.out.println(response.response().statusCode());
});
Thread.sleep(2000);
} catch (InvalidKeyException e) {
System.out.println("Invalid Storage account name/key provided");
} catch (MalformedURLException e) {
System.out.println("Invalid URI provided");
} catch (RestException e){
System.out.println("Service error returned: " + e.response().statusCode() );
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.