2017-04-10 3 views
0

Meine Anwendung verfügt über eine Massen-Upload-Funktion, bei der ein Benutzer in einer Tabelle einen Dateipfad für beispielsweise Client1/Creative Files/File1.jpg bereitstellt, wodurch diese Dateien in der Cloud-Datei gespeichert werden Aktie. Der Massen-Upload-Prozess liest Dateien von dem Ort und, falls er gefunden wird, wird er dann in den Blob-Speicher kopieren und einen Eintrag in der Datenbank erzeugen. Anfangs hatte ich alles im Blobspeicher, also war das Lesen der Dateien ziemlich einfach.Dateien können nicht von Azure gelesen werden. Dateifreigabe

CloudBlobContainer container = this.GetCloudBlobContainer(); 
var blob = container.GetBlockBlobReference(filePath); 

Da ich nicht auf ein Netzlaufwerk für das Blob-Speicher-Konto, habe ich ein neues Speicherkonto und erstellt eine Datei Service Karte konnte, so konnte ich auf den Anteil an Fenstern Karte für den Benutzer des Hochladen Dateien direkt von ihrer Maschine. Jetzt habe ich Probleme, Dateien von dieser Freigabe abzurufen, da immer angegeben wird, dass die Datei nicht existiert.

Wenn ich nach file.Exists() suche, kommt es mit "False" zurück, obwohl die Datei da draußen ist.

Der Dateipfad ist Client1/Creative Files/File1.jpg. Ich denke, wenn ich File1.jpg einfach auf die Freigabe ohne die Ordner hochlade, könnte das funktionieren, aber das Hinzufügen von Unterordnern erzeugt ein Problem. Wir müssen die Dateien organisieren und es könnte einige verschachtelte Ordner geben, die auf den Clients basieren und wie der Benutzer sie an ihrem Ende organisiert. Deshalb bitten wir sie, den Pfad in der Tabelle anzugeben. Was vermisse ich?

Wenn ich die Anwendung debuggen und überprüfen Sie die Datei StorageUri, ich sehe https://storageaccount.file.core.windows.net/sharename/Client%5CCreative%20Files%5CFile1.jpg

Beim Kopieren dieser URL im Browser, sehe ich nicht die Datei. Wie ich schon sagte, mit einem Blob-Container funktionierte derselbe Prozess nur mit der Datei, aber wenn ich die Dateien in eine Dateifreigabe verschoben habe, kann ich keine Datei zurückgeben.

+0

Wie gewährleisten Sie, dass die Datei in der Freigabe vorhanden ist? Verwenden Sie eine Art von Tool, um die Existenz der Datei zu überprüfen? –

+0

Ich habe die azure Dateifreigabe aus Windows zugeordnet und habe die Datei in derselben Struktur hochgeladen, wie in der Tabelle angegeben, z. B. Client1/Creative Files/File1.jpg. Ich kann das auch überprüfen, indem ich zum Azure-Portal gehe -> Speicherkonto -> Dateidienst -> Freigabe. Also, die Datei existiert aber nicht, wenn ich den obigen Code benutze. – bladerunner

+0

Noch eine Sache ... In Ihrem Code übergeben Sie 'filePath' als' Client1/Creative Files/File1.jpg'. Richtig? –

Antwort

0
  1. Ich habe versucht, sowohl Client1\\Creative Files\\File1.jpg sowie Client1/Creative Files/File1.jpg und in beiden Fällen die Angabe Ich habe File.Exists(), um wahr. Können Sie bitte nochmals bestätigen, dass die Datei tatsächlich existiert?

  2. Sie können einfach nicht die Datei URL nehmen und im Browser einfügen und erwarten, dass die Datei im Browser angezeigt wird. In Blob Storage können Sie die ACL eines Containers auf Blob oder Container setzen. Wenn Sie dann die URL des Blobs in das Adressfenster eines Browsers kopieren, wird dort das Blob angezeigt. File Share auf der anderen Seite sind immer Private und der Zugriff auf die Dateien muss autorisiert werden. Eine Sache, die Sie tun können, ist eine Shared Access Signature (SAS) für die Datei erstellen und kopieren Sie dann die SAS-URL in das Adressfenster des Browsers und dann können Sie die Datei sehen.

    var cred = new StorageCredentials(accountName, accountKey); 
        var account = new CloudStorageAccount(cred, true); 
        var client = account.CreateCloudFileClient(); 
        var fileShare = client.GetShareReference("temp"); 
        var rootDirectory = fileShare.GetRootDirectoryReference(); 
        var file1 = rootDirectory.GetFileReference("Client1\\Creative Files\\test.png"); 
        Console.WriteLine(file1.Exists()); 
        var file2 = rootDirectory.GetFileReference("Client1/Creative Files/test.png"); 
        Console.WriteLine(file2.Exists()); 
    
        //Create shared access signature on file with read permission valid for 1 hour. 
        var sasToken = file2.GetSharedAccessSignature(new SharedAccessFilePolicy() 
        { 
         Permissions = SharedAccessFilePermissions.Read, 
         SharedAccessExpiryTime = DateTime.UtcNow.AddHours(1) 
        }); 
        var fileSasUrl = string.Format("{0}{1}", file2.Uri.AbsoluteUri, sasToken); 
        Console.WriteLine(fileSasUrl); 
    
+0

Sorry für meine Dummheit. Ich habe meinen Dateipfad überprüft und auf dem Portal sagte einer der Ordner "Creative Proofs", aber in meiner Testdatei hatte ich es als Creative Files.Ich entschuldige mich, ich habe einfach Creative Files als Creative Proofs angesehen. Es funktioniert jetzt sicher, sobald ich meinen Dateipfad repariert habe. Vielen Dank für die Bereitstellung einer alternativen Lösung, die die gemeinsame Zugriffssignatur verwendet und mein Vertrauen stärkt, dass der Code funktionieren sollte. Dies ist zufällig ein Fehler von der Benutzerseite. :) – bladerunner

Verwandte Themen