0

VB.NET と Azure .NET アセンブリを使用して、Azure BLOB にファイルをアップロードしています。ファイルが大きいので、ブロックに分割して、CloudBlockBlob.PutBlock. 私が抱えている問題はBlockID、1 文字より長い を指定すると、「指定されたブロブまたはブロックのコンテンツが無効です」というメッセージが表示されることです。エラーからPutBLock。blockID が 1 文字のみの場合、正常にアップロードされます。

Dim iBlockSize As Integer = 1024  ' KB
Dim alBlockIDs As New ArrayList
Dim iBlockID As Integer = 10

' Create the blob client.
Dim blobClient As CloudBlobClient = storageAccount.CreateCloudBlobClient()
' Retrieve reference to a previously created container.
Dim container As CloudBlobContainer = blobClient.GetContainerReference("mycontainer")
' Retrieve reference to a blob named "myblob".
Dim blockBlob As CloudBlockBlob = container.GetBlockBlobReference("myblob")

Dim buffer(iBufferSize) As Byte
fs.Read(buffer, 0, buffer.Length)
Using ms As New MemoryStream(buffer)
    ' convert block id to Base64 Encoded string 
    Dim b64BlockID As String = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(iBlockID.ToString(Globalization.CultureInfo.InvariantCulture)))
    ' write the blob block
    blockBlob.PutBlock(b64BlockID, ms, Nothing)

    alBlockIDs.Add(b64BlockID)
    iBlockID += 1
End Using

の場合iBlockID = 1PutBlockメソッドは正常に機能します (各ブロックで同じ長さの blockID に対処する必要がありますが、後で心配します)。何が起こっているのですか?現在、ローカルの Azure ストレージ エミュレーターでテストしています。

4

1 に答える 1

1

確認することはできませんが、コード内で、これらのバッファを作成しているときにメモリがオーバーラップしている可能性があります。ブロック単位でBlobをアップロードするには、次の作業コードを参照してください。次のコードは10240(10KB)のブロックサイズを使用していますが、簡単に変更できます

Dim fileName As String = "D:\Untitled.png"
Dim fileSize As Long = New FileInfo(fileName).Length
Dim blockNumber As UInteger = 0
Dim blocksize As UInteger = 10240 '10KB
Dim blockIdList As List(Of String) = New List(Of String)

Using fs As New FileStream(fileName, FileMode.Open, FileAccess.Read)

    Do While (fileSize > 0)
        Dim bufferSize As UInteger

        'Last block of file can be less than 10240 bytes
        If (fileSize > blocksize) Then
            bufferSize = blocksize
        Else
            bufferSize = fileSize
        End If

        Dim buffer(bufferSize) As Byte
        Dim br As New BinaryReader(fs)

        'move the file system reader to the proper position
        fs.Seek(blocksize * blockNumber, SeekOrigin.Begin)
        br.Read(buffer, 0, bufferSize)

        Using ms As New MemoryStream(buffer, 0, bufferSize)
            'convert block id to Base64 Encoded string 
            Dim b64BlockID As String = Convert.ToBase64String(Encoding.ASCII.GetBytes(String.Format("BlockId{0}", blockNumber.ToString("0000000"))))
            blockBlob.PutBlock(b64BlockID, ms, Nothing)

            blockIdList.Add(b64BlockID)
        End Using

        blockNumber += 1
        fileSize -= blocksize
    Loop

    blockBlob.PutBlockList(blockIdList)

End Using
于 2012-12-19T10:37:48.890 に答える