This last weekend I participated in the "Hack for the Sea" hackathon. As part of that, I needed to store images and structured data to Azure Storage. The process is very straightforward using F#'s async
capabilities.
First, you'll need the connection string for your Azure Storage:
Use that to instantiate a CloudStorageAccount
object:
let csa = CloudStorageAccount.Parse connectionString
Then, write method(s) to store the data in either Blob storage or Table storage:
// Put directly in Azure blob storage
let photoSubmissionAsync (cloudStorageAccount : CloudStorageAccount) imageType (maybePhoto : IO.Stream option) imageName =
async {
match maybePhoto with
| Some byteStream ->
let containerName = "marinedebrispix"
let ctb = cloudStorageAccount.CreateCloudBlobClient()
let container = ctb.GetContainerReference containerName
let blob = container.GetBlockBlobReference(imageName) //|> Async.AwaitTask
blob.Properties.ContentType <- imageType
do! blob.UploadFromStreamAsync(byteStream) |> Async.AwaitTask
return true
| None -> return false
}
// Put directly in Azure table storage
let reportSubmissionAsync (cloudStorageAccount : CloudStorageAccount) report photoName =
async {
let ctc = cloudStorageAccount.CreateCloudTableClient()
let table = ctc.GetTableReference("MarineDebris")
let record = new ReportStorage(report)
let insertOperation = record |> TableOperation.Insert
let! tr = table.ExecuteAsync(insertOperation) |> Async.AwaitTask
return tr.Etag |> Some
}
The object passed to TableOperation.Insert
must be a subclass of TableEntity
:
type ReportStorage(report : Report) =
inherit TableEntity( "MainPartition", report.Timestamp.ToString("o"))
member val public Report = report |> toJson with get, set