2017-04-10 16 views
0

私のアプリケーションには、スプレッドシートのユーザーがファイルパスを提供する一括アップロード機能があります.Client1/Creative Files/File1.jpgなどのファイルパスがあります。シェア。大量アップロードプロセスでは、その場所からファイルが読み込まれ、見つかった場合は、BLOBストレージにコピーされ、データベースにエントリが作成されます。最初は、ブロブストレージ内にすべてがありましたので、ファイルを読むのはかなり簡単でした。Azureファイル共有からファイルを読み取ることができません

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

私はBLOBストレージアカウントのネットワークドライブにマップすることができなかったとして、私は新しいストレージアカウントを作成し、ファイルサービスを作成し、そのユーザーがアップロードするために、私は窓の上の共有にマップすることができファイルをマシンから直接取り出します。今、私はファイルが存在しないと言っているので、この共有からファイルを取り出すことに問題があります。

public CloudFileShare GetCloudFileShare() 
    { 
     CloudStorageAccount storageAccount = CloudStorageAccount.Parse(settings.AzureDropBoxConnectionString); 
     CloudFileClient fileClient = storageAccount.CreateCloudFileClient(); 
     CloudFileShare filehare = fileClient.GetShareReference(settings.AzureDropboxFileShare); 
     filehare.CreateIfNotExists(); 

     return filehare; 
    } 
public CloudFile GetFileFromCloudShare(string filePath) 
    { 
     CloudFileShare fileShare = this.GetCloudFileShare(); 
     var file = fileShare.GetRootDirectoryReference().GetFileReference(filePath); 

     return file; 
    } 

私がfile.Exists()をチェックすると、そこにファイルがあるのに "False"が返されます。

filePathはClient1/Creative Files/File1.jpgです。私は、File1.jpgをフォルダなしでShareにアップロードしても、これはうまくいくはずですが、サブフォルダを追加すると問題が発生していると思います。私たちはファイルを整理する必要があり、クライアントに基づいていくつかのネストされたフォルダが存在する可能性があり、ユーザーが最後にそれらを整理する方法があります。そのため、スプレッドシートにパスを提供するよう依頼します。私は何が欠けていますか?私は、アプリケーションをデバッグし、ファイルStorageUriをチェックすると

が、私はブラウザにこのURLをコピーしたら

https://storageaccount.file.core.windows.net/sharename/Client%5CCreative%20Files%5CFile1.jpgを参照してください、私は、ファイルが表示されません。私が言ったように、Blobコンテナでは、この同じプロセスはファイルだけで動作していましたが、ファイルをファイル共有に移動したときにファイルを返すことができません。

+0

どのようにファイルが共有に存在していることを保証していますか?ファイルの存在を確認するために何らかのツールを使用していますか? –

+0

私はWindowsからの紺碧のファイル共有にマップし、スプレッドシート、すなわちClient1/Creative Files/File1.jpgに示されているのと同じ構造でファイルをアップロードしました。 Azureポータル - >ストレージアカウント - >ファイルサービス - >共有に移動して確認することもできます。したがって、ファイルは存在しますが、上記のコードを使用していないと、そのファイルは存在しません。 – bladerunner

+0

もうひとつ...あなたのコードでは、 'file1'を' Client1/Creative Files/File1.jpg'として渡しています。正しい? –

答えて

0
  1. 私はClient1\\Creative Files\\File1.jpgなどClient1/Creative Files/File1.jpgの両方を指定しようとしたし、両方のケースで私がtrueにfile.Exists()を得ました。ファイルが実際に存在することを再確認してください。

  2. ファイルのURLをブラウザに貼り付けて、ブラウザにファイルが表示されることを期待することはできません。 BLOBストレージでは、コンテナのACLをBlobまたはContainerに設定し、BLOBのURLをブラウザのアドレスウィンドウにコピーするとBLOBがそこに表示されます。一方、ファイル共有は常にPrivateであり、ファイルへのアクセスは許可される必要があります。あなたができることの1つは、ファイルにShared Access Signature (SAS)を作成し、ブラウザのアドレスウィンドウにSAS URLをコピーすると、ファイルを見ることができるようになります。

    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

私のばかげて申し訳ありません。私は自分のファイルパスをチェックし、ポータルでは、フォルダの1つが「Creative Proofs」と言っていましたが、私のテストファイルでCreative Filesとして持っていました。私は謝罪する、私はちょうど創造性の証明として創造的なファイルを探し続けた。私のファイルパスを修正した今、その作業は確実です。共有アクセス署名を使用して代替ソリューションを提供していただき、ありがとうございます。これはちょうどユーザ側からの誤りであった。 :) – bladerunner

関連する問題