示例#1
0
        public async Task <bool> AddFiles(string AccountName, string AccountKey, Guid ContainerName, string filename, int filesize, string mimeType)
        {
            string blockHash;

            byte[] hashCode;
            string UserConnectionString        = string.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", AccountName, AccountKey);
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(UserConnectionString);
            CloudBlobClient     blobClient     = storageAccount.CreateCloudBlobClient();
            CloudBlobContainer  container      = blobClient.GetContainerReference(ContainerName.ToString());
            var containerData = await container.CreateIfNotExistsAsync();

            if (containerData)
            {
                await container.SetPermissionsAsync(new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob });
            }
            var checkIfExists = container.GetBlockBlobReference(ContainerName + "_" + filename).ExistsAsync();

            if (checkIfExists.Result == true)
            {
                return(false);
            }
            string contentType;
            var    provider = new FileExtensionContentTypeProvider();

            if (!provider.TryGetContentType(filename, out contentType))
            {
                contentType = "application/octet-stream";
            }
            if (mimeType != null)
            {
                if (mimeType != contentType)
                {
                    return(false);
                }
                else
                {
                    contentType = mimeType;
                }
            }
            CloudBlockBlob blockBlob = container.GetBlockBlobReference(ContainerName + "_" + filename);
            string         rootpath  = AppContext.BaseDirectory;

            if (rootpath.Contains("bin"))
            {
                rootpath = rootpath.Substring(0, rootpath.IndexOf("bin"));
            }
            string path = rootpath + @"\BatchFiles\";

            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }
            string filePath = path + ContainerName + "_" + filename;

            using (FileStream fs = System.IO.File.Create(filePath))
            {
                commonUtility.AddText(fs, "foo");
                commonUtility.AddText(fs, "bar\tbaz");
                hashCode = MD5.Create().ComputeHash(fs);
            }
            using (FileStream fileStream =
                       new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                int           blockSize   = filesize * 1024;
                long          fileSize    = fileStream.Length;
                int           blockCount  = (int)((float)fileSize / (float)blockSize) + 1;
                List <string> blockIDs    = new List <string>();
                int           blockNumber = 0;

                int  bytesRead = 0;
                long bytesLeft = fileSize;
                while (bytesLeft > 0)
                {
                    blockNumber++;
                    int bytesToRead;
                    if (bytesLeft >= blockSize)
                    {
                        bytesToRead = blockSize;
                    }
                    else
                    {
                        bytesToRead = (int)bytesLeft;
                    }
                    string blockId =
                        Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(string.Format("BlockId{0}",
                                                                                          blockNumber.ToString("0000000"))));
                    blockIDs.Add(blockId);
                    byte[] bytes = new byte[bytesToRead];
                    fileStream.Read(bytes, 0, bytesToRead);
                    blockHash = commonUtility.GetMD5HashFromStream(bytes);
                    await blockBlob.PutBlockAsync(blockId, new MemoryStream(bytes), blockHash);

                    bytesRead += bytesToRead;
                    bytesLeft -= bytesToRead;
                }

                await blockBlob.PutBlockListAsync(blockIDs);

                BatchFilesMetaData batchFilesMetaData = new BatchFilesMetaData();
                batchFilesMetaData.BatchId  = ContainerName;
                batchFilesMetaData.FileName = ContainerName + "_" + filename;
                batchFilesMetaData.MIMEType = contentType;
                batchFilesMetaData.FileSize = filesize;
                batchFilesMetaData.Hash     = BitConverter.ToString(hashCode);
                batchDBContext.BatchFilesMetaData.Add(batchFilesMetaData);
                batchDBContext.SaveChanges();
                return(true);
            }
        }