コード例 #1
0
        public async Task <IActionResult> SiaZip(string hash, [FromQuery] string path)
        {
            var zipStream = new System.IO.Compression.HttpZipStream("https://siasky.net/" + hash);

            if (await zipStream.GetContentLengthAsync() == -1)
            {
                return(NotFound("No such Sia hash."));
            }
            using (zipStream)
            {
                await zipStream.GetContentLengthAsync();

                string content   = "";
                var    entryList = await zipStream.GetEntriesAsync();

                bool found = false;
                foreach (var e in entryList)
                {
                    if (e.FileName != path)
                    {
                        continue;
                    }
                    found = true;
                    await zipStream.ExtractAsync(e, async (entryStream) =>
                    {
                        byte[] buffer = new byte[4096];
                        while (true)
                        {
                            int result = await entryStream.ReadAsync(buffer, content.Length, 4096);
                            if (result == 0)
                            {
                                break;
                            }
                            content += buffer.ToString();
                        }
                    });
                }
                if (!found)
                {
                    return(NotFound("No such file in archive."));
                }
                System.Net.Mime.ContentDisposition cd = new System.Net.Mime.ContentDisposition
                {
                    FileName = path,
                    Inline   = false,
                };
                Response.Headers.Add("Content-Disposition", cd.ToString());
                return(View(content));
            }
        }
コード例 #2
0
        public async void ExampleStream_SmallerEntryExtraction_MustResult_MemoryStream_With_227kbytes()
        {
            using (var streamZip = new HttpZipStream(httpUrl))
            {
                var contentLength = await streamZip.GetContentLengthAsync();

                var entryList = await streamZip.GetEntriesAsync();

                var smallerEntry = entryList
                                   .OrderBy(x => x.CompressedSize)
                                   .Take(1)
                                   .FirstOrDefault();
                long memoryStreamLength = 0;
                await streamZip.ExtractAsync(smallerEntry, (MemoryStream memoryStream) =>
                {
                    memoryStreamLength = memoryStream.Length;
                });

                Assert.Equal(232660, memoryStreamLength);
            }
        }