在Azure中将文本附加到Blob

时间:2010-09-26 15:59:17

标签: windows azure azure-storage blobs

在查看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)

3 个答案:

答案 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()附加新内容。