Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android中使用Azure存储获取上载进度_Android_Azure_Azure Storage_Progress - Fatal编程技术网

在Android中使用Azure存储获取上载进度

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

我正在我的Android应用程序中上传一个文件。代码非常简单:

    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来编写这段代码,所以我接受了你的回答。谢谢:)