不要覆盖Azure Blob存储

时间:2017-12-08 14:53:20

标签: c# azure cloud azure-storage-blobs blobstorage

我有一个方法可以将文件添加到Azure Blob存储,问题是我正在尝试指定一个条件,它不会覆盖blob而只是添加它。我试图使用参数访问条件但是VS说这个方法不能带两个参数 -        async void archiveNewImportedImages(List imageFiles)         {

import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;


public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {

        GridPane grid = new GridPane();
        grid.setGridLinesVisible(true);

        for (int i = 0; i < 20; i++) {
            for (int j = 0; j < 20; j++) {
                grid.add(new Button("foo"),i,j);
                //                Button myBtn = new Button("foo");
                //                GridPane.setColumnIndex(myBtn, i);
                //                GridPane.setRowIndex(myBtn, j);
                //                grid.getChildren().add(myBtn);
            }
        }


        Scene scene = new Scene(grid);

        Stage stage = new Stage();
        stage.setScene(scene);
        stage.show();

        String[] colors = {"-fx-background-color: red;", "-fx-background-color: blue;", "-fx-background-color: white;"};
        for (int i = 0; i < 20; i++) {
            for (int j = 0; j < 20; j++) {
                Node node = getNodeFromGridPane(grid,i,j);
                if(node instanceof Button)
                    node.setStyle(colors[(int) (Math.random() * 3)]);
            }
        }
    }

    private Node getNodeFromGridPane(GridPane gridPane, int col, int row) {
        for (Node node : gridPane.getChildren())
            if (GridPane.getColumnIndex(node) != null
                    && GridPane.getColumnIndex(node) != null
                    && GridPane.getRowIndex(node) == row
                    && GridPane.getColumnIndex(node) == col)
                return node;
        return null;
    }

    public static void main(String[] args) { launch(args); }
}

有什么建议吗?

结束目标:不要覆盖容器 - 继续添加不同的文件ex。 img1.jpg,img2.jpg到blob

其他详细信息:想要将图像附加到容器中(换句话说,继续将图像添加到容器中)。如果文件存在,则不想覆盖现有文件)

2 个答案:

答案 0 :(得分:1)

按照设计,如果您尝试上传具有相同blob名称的新内容,Azure Blob存储将覆盖blob的内容。

如果您不想覆盖内容,可以执行某些操作,但之后您必须为其编写代码。

  1. 在上传之前检查blob是否存在并使上载操作失败,并通知用户为blob选择另一个名称或在代码中指定新名称。您可以通过调用blob.ExistsAsync来检查blob的存在,或者使用您当前正在执行的访问条件来执行操作。在第一种情况下,您将获得一个真/假值,并根据您决定要做什么。在第二种情况下,上传操作将失败并显示PreConditionNotMet (412 Status Code),因此您需要捕获异常并决定您要执行的操作。
  2. 如果您打算保留所有更改的历史记录,那么您应该查看Azure Blob存储中提供的blob snapshot功能。拍摄blob的快照时,它会创建blob的只读副本。但请记住,在这种情况下,只有一个blob和许多快照。每个快照由快照的日期/时间唯一标识。您可以获取blob及其快照,以查看对该Blob所做更改的历史记录。

答案 1 :(得分:0)

现在有一个CloudAppendBlob类,允许您向现有blob添加内容:

var account = CloudStorageAccount.Parse("storage account connectionstring");
var client = account.CreateCloudBlobClient();
var container = client.GetContainerReference("container name");
var blob = container.GetAppendBlobReference("blob name");

在您的情况下,您想要从文件追加:

await blob.AppendFromFileAsync("file path");

但是你可以从文本,字节数组,流中追加。查看文档。