在查看blobs上的这个教程:channel 9后,我正在考虑使用blob容器来保存一堆推文(存储每条推文的json)。理想情况下,我想为一天中的每个小时创建一个blob引用,并在它们进入时向这个blob添加新的推文。问题是,方法UploadText(字符串)会覆盖blob的现有内容,是否容易将文本追加到现有blob的方法?
谢谢!
fun (json:string) ->
let account = CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue("DataConnectionString"))
let blobs = account.CreateCloudBlobClient();
let tempBlob = blobs.GetBlobReference("tweets/2010-9-26/17/201092617.txt")
tempBlob.Properties.ContentType <- "text/plain"
tempBlob.UploadText(json)
答案 0 :(得分:8)
Azure现在支持Append Blobs。创建新blob时,必须将其定义为Append Block。您无法附加到现有块blob。
这里有一些你可以使用的简单代码。
<强>附加:强>
appendBlob.DownloadText()
<强>读:强>
import swing._
import javax.swing.JComboBox
import javax.swing.table.AbstractTableModel
import javax.swing.DefaultCellEditor
//////////////////////////////////////////////////////////////////////////////////////////////////
class MyModel(var cells: Array[Array[Any]], val columns: Array[Any] ) extends AbstractTableModel {
def getRowCount(): Int = cells.length
def getColumnCount(): Int = columns.length
def getValueAt(row: Int, col: Int): AnyRef = cells(row)(col).asInstanceOf[AnyRef]
override def getColumnClass(column: Int) = getValueAt(0, column).getClass
override def isCellEditable(row: Int, column: Int) = if (column == 0) false else true
override def setValueAt(value: Any, row: Int, col: Int) {
cells(row)(col) = value
fireTableCellUpdated(row, col)
}
override def getColumnName(column: Int): String = columns(column).toString
}
//////////////////////////////////////////////////////////////////////////////////////////////////
class TestTable extends ScrollPane {
final val columns: Array[Any] = Array[Any]( "Column1", "Column2" )
final val Col1Data: Array[Any] = Array[Any]( "Col1_Data",
"Col2_Data", "Col3_Data", "Col4_Data", "Col5_Data", "Col6_Data"
)
var modelarr = Array.ofDim[Any](Col1Data.length, columns.length)
for (i <- 0 until Col1Data.length) {
modelarr(i)(0) = Col1Data(i)
// Have tried to set it to 1/"Value2"
modelarr(i)(1) = "Value2"
}
val table = new Table( modelarr, columns ) {
val mymodel = new MyModel(modelarr, columns)
model = mymodel
val Col1 = peer.getColumnModel.getColumn( 1 )
val cb = new JComboBox[String](Array("Value1", "Value2", "Value3"))
Col1.setCellEditor( new DefaultCellEditor( cb ) )
}
viewportView = table
}
//////////////////////////////////////////////////////////////////////////////////////////////////
object MyCombo extends SimpleSwingApplication {
override def main(args: Array[String]) = super.main(args)
var mytable = new TestTable
def top = new MainFrame {
title = "Table Test"
contents = mytable
}
}
Technet contains a good tutorial关于这个问题。此外,official Azure documentation现在包含使用附加Blob的帮助。
答案 1 :(得分:4)
Page Blobs 是满足这种需求的方法。 (vs blob)
使用Put Blob操作创建blob: http://msdn.microsoft.com/en-us/library/dd179451.aspx
然后你可以使用Put页面操作添加“pages”: http://msdn.microsoft.com/en-us/library/ee691975.aspx
Page Blobs将立即修改添加了put的页面,更准确地模仿传统文件系统。
Block blob预计会有更多的构建,并且需要两阶段提交/提交构造。编译完成后,你必须覆盖以修改blob。块blob设计用于静态(松散定义)内容的流式传输,而不是读/写存储。添加了页面Blob以支持这些方案。
答案 2 :(得分:1)
您可以尝试通过 CloudBlockBlob.DownloadBlockList()方法获取已提交块的列表,然后通过 CloudBlockBlob.PutBlock()附加新内容。