4
votes

télécharger des fichiers à partir du compartiment s3 en utilisant C #

Je suis un peu nouveau dans le concept de compartiment AWS s3. Je suis censé télécharger des fichiers du dossier "TODAY FILE1" dans s3 s3 et l'utiliser. Je sais comment le faire en ligne de commande en utilisant l'invite de commande. Je ne sais pas comment implémenter en C #.

Supposons que

Voici ce que je fais à l'invite de commande

string accessKey = "abc123";
string secretKey = "secret123";
string bucketName = "mys3bucket-output"
TransferUtility fileTransferUtility =   new TransferUtility(new AmazonS3Client(accessKey, secretKey, Amazon.RegionEndpoint.USEast2));


BasicAWSCredentials basicCredentials = new BasicAWSCredentials(accessKey,secretKey);
AmazonS3Client s3Client = new AmazonS3Client(new BasicAWSCredentials(accessKey, secretKey), Amazon.RegionEndpoint.USEast2);
ListObjectsRequest request = new ListObjectsRequest();

ListObjectsResponse response = s3Client.ListObjects(request.BucketName= bucketName, request.Prefix="TODAY FILE1/");

foreach (S3Object obj in response.S3Objects)
{
    try
    {
        Console.WriteLine("{0}", obj.Key);
        fileTransferUtility.Download(@"C:\Temp", bucketName, obj.Key);

    }
    catch (Exception Excep)
    {
        Console.WriteLine(Excep.Message, Excep.InnerException);
    }
}

voici ce que je fais C # programme et obtenir une erreur

C:\> aws s3 cp "s3://mys3bucket-output/TODAY FILE1" . --recursive

J'obtiens une exception Amazon.Runtime.AmazonServiceException: 'L'accès au chemin' C: \ Temp 'est refusé

I je ne sais pas quoi faire Merci MR


5 commentaires

Avez-vous un dossier nommé C: \ Temp sur votre machine? Ou existe-t-il un fichier nommé C: \ Temp ?


Pourquoi voulez-vous télécharger "C: \ Temp"? Pouvez-vous essayer avec un fichier réellement existant auquel vous avez accès?


@devdimi le premier paramètre est le chemin cible


Yah j'ai un dossier C: \ temp sur ma machine locale


L'utilisateur que votre code exécute a-t-il les autorisations nécessaires pour écrire dans ce fichier? S'exécute-t-il en tant qu'administrateur?


3 Réponses :


4
votes

Créez les fichiers avant d'écrire:

foreach (S3Object obj in response.S3Objects)
{
    try
    {
        string filename = directoryPath + "\\" + obj.Key;
        FileStream fs = File.Create(filename);
        fs.Close();
        Console.WriteLine("{0}", obj.Key);
        fileTransferUtility.Download(filename, bucketName, obj.Key);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message, ex.InnerException);
    }
}


0 commentaires

0
votes

Voici une autre façon de télécharger des fichiers à partir du compartiment S3. Supposons que si vous travaillez avec un compte Entreprise avec un client Entreprise, vous ne pourrez pas obtenir de clé d'accès et de clé secrète en raison de problèmes de sécurité. Dans ce scénario, vous pouvez utiliser l'extrait de code ci-dessous pour télécharger le fichier (tout type de fichier de format).

protected void button1_click(object sender, EventArgs e)
{
try
{
string _FullName = lbFile.CommandName.ToString();
 string _FilePath = ConfigurationManager.AppSettings["SharedLocation"];
            string bucketName = ConfigurationManager.AppSettings["S3BucketName"];
//First I am creating a file with the file name in my local machine in a shared folder
            string FileLocation = _FilePath + "\\" + _FullName;
            FileStream fs = File.Create(_FullName);
            fs.Close();
            TransferUtility fileTransferUtility = new TransferUtility();
            fileTransferUtility.Download(FileLocation, bucketName, _FullName);
            fileTransferUtility.Dispose();
            WebClient webClient = new WebClient();
            HttpResponse response = HttpContext.Current.Response;
            response.Clear();
            response.ClearContent();
            response.ClearHeaders();
            response.Buffer = true;
            response.AddHeader("Content-Disposition", "attachment;filename=" + _FullName.ToString() + "");
            byte[] data = webClient.DownloadData(FileLocation);
            File.Delete(FileLocation); //After download starts, then I am deleting the file from the local path which I created initially.
            response.BinaryWrite(data);
            response.End();
}

}

Si vous avez besoin d'aide pour cette implémentation, n'hésitez pas à me contacter.


0 commentaires

1
votes

Vous devez mettre le nom du fichier: fileTransferUtility.Download (@ "C: \ Temp \ filename.xxx", bucketName, obj.Key);


0 commentaires