在Android中使用Azure存储获取上载进度
我正在我的Android应用程序中上传一个文件。代码非常简单:在Android中使用Azure存储获取上载进度,android,azure,azure-storage,progress,Android,Azure,Azure Storage,Progress,我正在我的Android应用程序中上传一个文件。代码非常简单: private boolean UploadFile(String fileLocation) { try { if (TextUtils.isEmpty(fileLocation)) { return false; } File fSrc = new File(fileLocation);
private boolean UploadFile(String fileLocation) {
try {
if (TextUtils.isEmpty(fileLocation)) {
return false;
}
File fSrc = new File(fileLocation);
if (!fSrc.exists()) {
return false;
}
boolean bReturn = AzureManager.init(this);
if (!bReturn) {
return false;
}
String blobName = fSrc.getName();
InputStream in = new BufferedInputStream(new FileInputStream(fSrc));
CloudBlobContainer container = AzureManager.getCloudBlobClient().getContainerReference(AzureManager.getContainerName());
CloudBlockBlob blob = container.getBlockBlobReference(blobName);
blob.upload(in, fSrc.length());
in.close();
return true;
} catch (Exception e) {
//handle exception
}
return false;
}
当我从Azure下载时,CloudBlockBlob有一个下载侦听器:
blob.setDownloadListener(eventListener);
但是,在上传时,我如何跟踪进度呢?我也在寻找用Java或Android实现的方法。但是,如果您想以自己的方式制作,而不改变服务器上的任何内容,您可以使其类似于。答案是C语言,所以您需要为Java库找到类似的方法,并相应地进行更新 如果您不想继续回答这个问题,您也可以从这里引用相同的代码
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static CloudStorageAccount storageAccount = new CloudStorageAccount(new StorageCredentials("accountname", "accountkey"), true);
static void Main(string[] args)
{
CloudBlobClient myBlobClient = storageAccount.CreateCloudBlobClient();
myBlobClient.SingleBlobUploadThresholdInBytes = 1024 * 1024;
CloudBlobContainer container = myBlobClient.GetContainerReference("adokontajnerneki");
//container.CreateIfNotExists();
CloudBlockBlob myBlob = container.GetBlockBlobReference("cfx.zip");
var blockSize = 256 * 1024;
myBlob.StreamWriteSizeInBytes = blockSize;
var fileName = @"D:\cfx.zip";
long bytesToUpload = (new FileInfo(fileName)).Length;
long fileSize = bytesToUpload;
if (bytesToUpload < blockSize)
{
CancellationToken ca = new CancellationToken();
var ado = myBlob.UploadFromFileAsync(fileName, FileMode.Open, ca);
Console.WriteLine(ado.Status); //Does Not Help Much
ado.ContinueWith(t =>
{
Console.WriteLine("Status = " + t.Status);
Console.WriteLine("It is over"); //this is working OK
});
}
else
{
List<string> blockIds = new List<string>();
int index = 1;
long startPosition = 0;
long bytesUploaded = 0;
do
{
var bytesToRead = Math.Min(blockSize, bytesToUpload);
var blobContents = new byte[bytesToRead];
using (FileStream fs = new FileStream(fileName, FileMode.Open))
{
fs.Position = startPosition;
fs.Read(blobContents, 0, (int)bytesToRead);
}
ManualResetEvent mre = new ManualResetEvent(false);
var blockId = Convert.ToBase64String(Encoding.UTF8.GetBytes(index.ToString("d6")));
Console.WriteLine("Now uploading block # " + index.ToString("d6"));
blockIds.Add(blockId);
var ado = myBlob.PutBlockAsync(blockId, new MemoryStream(blobContents), null);
ado.ContinueWith(t =>
{
bytesUploaded += bytesToRead;
bytesToUpload -= bytesToRead;
startPosition += bytesToRead;
index++;
double percentComplete = (double)bytesUploaded / (double)fileSize;
Console.WriteLine("Percent complete = " + percentComplete.ToString("P"));
mre.Set();
});
mre.WaitOne();
}
while (bytesToUpload > 0);
Console.WriteLine("Now committing block list");
var pbl = myBlob.PutBlockListAsync(blockIds);
pbl.ContinueWith(t =>
{
Console.WriteLine("Blob uploaded completely.");
});
}
Console.ReadKey();
}
}
}
使用Microsoft.WindowsAzure.Storage;
使用Microsoft.WindowsAzure.Storage.Auth;
使用Microsoft.WindowsAzure.Storage.Blob;
使用制度;
使用System.Collections.Generic;
使用System.IO;
使用System.Linq;
使用系统文本;
使用系统线程;
使用System.Threading.Tasks;
命名空间控制台应用程序1
{
班级计划
{
静态CloudStorageAccount storageAccount=新的CloudStorageAccount(新的StorageCredentials(“accountname”、“accountkey”),true);
静态void Main(字符串[]参数)
{
CloudBlobClient myBlobClient=storageAccount.CreateCloudBlobClient();
myBlobClient.SingleBlobUploadThresholdInBytes=1024*1024;
CloudBlobContainer container=myBlobClient.GetContainerReference(“adokontajnerneki”);
//container.CreateIfNotExists();
CloudBlockBlob myBlob=container.GetBlockBlobReference(“cfx.zip”);
var blockSize=256*1024;
myBlob.StreamWriteSizeInBytes=块大小;
var fileName=@“D:\cfx.zip”;
long bytesToUpload=(新文件信息(文件名)).Length;
long fileSize=bytesToUpload;
if(bytesToUpload
{
Console.WriteLine(“Status=“+t.Status”);
Console.WriteLine(“结束”);//这工作正常
});
}
其他的
{
List blockIds=新列表();
int指数=1;
长起始位置=0;
长字节数=0;
做
{
var bytesToRead=Math.Min(块大小,bytesToUpload);
var blobContents=新字节[bytesToRead];
使用(FileStream fs=newfilestream(fileName,FileMode.Open))
{
fs.位置=起始位置;
读取(blobContents,0,(int)bytesToRead);
}
ManualResetEvent mre=新的ManualResetEvent(错误);
var blockId=Convert.ToBase64String(Encoding.UTF8.GetBytes(index.ToString(“d6”));
Console.WriteLine(“现在正在上传块#”+index.ToString(“d6”);
blockId.Add(blockId);
var ado=myBlob.putblocksync(blockId,新内存流(blobContents),null);
ado.ContinueWith(t=>
{
bytesUpload+=bytesToRead;
bytesToUpload-=bytesToRead;
startPosition+=bytesToRead;
索引++;
完成双百分比=(双)字节上载/(双)文件大小;
Console.WriteLine(“完成百分比=”+完成百分比.ToString(“P”);
mre.Set();
});
韦通先生();
}
while(bytesToUpload>0);
WriteLine(“正在提交阻止列表”);
var pbl=myBlob.PutBlockListAsync(blockIds);
pbl.ContinueWith(t=>
{
Console.WriteLine(“Blob已完全上传”);
});
}
Console.ReadKey();
}
}
}
嗨,你找到解决办法了吗?嗨。我的队友对AzureSDK做了一些修改,我真的不知道他做了什么,但这是我们获得百分比的方法。这让我想起了为我们工作的代码。谢谢,如果有人花时间修改Azure的库,这应该可以工作。谢谢,欢迎光临。请让我知道,如果你做类似的android。如果答案对你有效,也请接受。谢谢。我不再使用Azure了,但我几乎可以肯定有人可以用Azure Android SDK来编写这段代码,所以我接受了你的回答。谢谢:)