Возникли проблемы с архивированием байтового массива и загрузкой на s3 - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь сохранить данные в формате json в s3, но без сохранения файла на диске вообще.

Я получил его, чтобы создать строку с помощью Streamwriter.затем я использую https://github.com/icsharpcode/SharpZipLib, чтобы сжать массив байтов, а затем загрузить его в aws s3.проблема в том, что если я смотрю на файл на s3, я вижу его как filename.json.gz, что правильно, но когда я скачиваю его, он скачивает его как filename.zip по какой-то причине

здесьмой код:

public UploadToS3Response BackupEventsToS3WithoutFiles(int tripId, string profileId, DateTimeOffset eventsReceivedAt, ICollection<AppComponents.Models.Event> events, string filePath, string s3Path)
    {
        var response = new UploadToS3Response() { Success = false };

        var fileName = $"tripevents-{tripId}-{DateTimeOffset.Now.ToString("yyyyMMdd")}-{profileId}";
        var s3PathPrefix = s3Path;

        try
        {
            var accessKey = ConfigurationManager.AppSettings["aws:accesskey"];
            var accessSecret = ConfigurationManager.AppSettings["aws:secretkey"];


            var zippedStream = ZipBytes(fileName,events,tripId);
            byte[] zipData = Encoding.ASCII.GetBytes(zippedStream.ToString());

            var uploadToS3Response = Helpers.AWSHelper.UploadFiletoS3fromZip(accessKey, accessSecret, zipData, $"{fileName}.json.gz", s3PathPrefix, FileGranularity.Hourly, eventsReceivedAt);

            if (uploadToS3Response.Success)
            {
                response.Success = true;
                response.S3FilePath = uploadToS3Response.S3FilePath;
            }
        }
        catch (Exception ex)
        {
            ex.ToExceptionless().Submit();
            throw;
        }
        return response;

    }

вот мой почтовый класс

public byte[] ZipBytes(string filename, ICollection<AppComponents.Models.Event> events, int tripId)
    {
        var fullFileName = $"{filename}.json.gz";
        MemoryStream outputMemStream = new MemoryStream();
        ZipOutputStream zipStream = new ZipOutputStream(outputMemStream);

        zipStream.SetLevel(3); //0-9, 9 being the highest level of compression
        byte[] bytes = null;

        var newEntry = new ZipEntry($"{filename}.json.gz");
        newEntry.DateTime = DateTime.Now;

        zipStream.PutNextEntry(newEntry);

        bytes = WriteEventsToJsonBytes(events, tripId);

        MemoryStream inStream = new MemoryStream(bytes);
        StreamUtils.Copy(inStream, zipStream, new byte[4096]);
        inStream.Close();
        zipStream.CloseEntry();

        zipStream.IsStreamOwner = false;    // False stops the Close also Closing the underlying stream.
        zipStream.Close();          // Must finish the ZipOutputStream before using outputMemStream.

        outputMemStream.Position = 0;

        return outputMemStream.ToArray();
    }

вот мой WriteEventsToJsonBytes

private byte[] WriteEventsToJsonBytes(ICollection<AppComponents.Models.Event> events, int tripId)
    {
        StringBuilder builder = new StringBuilder();

        var row = "";

        foreach (var eventData in events)
        {
            eventData.TripId = tripId;
            JObject obj = JObject.FromObject(eventData);
            row = obj.ToString(Newtonsoft.Json.Formatting.None);
            builder.Append(row);
            row = "";
        }

        // convert string to stream
        byte[] byteArray = Encoding.ASCII.GetBytes(builder.ToString());

        return byteArray;
    }

Любая помощь будет высоко ценится

...