Example #1
0
 /// <summary>
 /// read data from stream
 /// </summary>
 /// <param name="stream">your stream to read a block</param>
 /// <param name="compress">compress mode</param>
 /// <returns>return a block byte array</returns>
 public static byte[] ReadBlockToEnd(NetworkStream stream, CompressMode compress, uint maximum, bool isWebSocket)
 {
     if (isWebSocket)
     {
         ulong       size     = 0;
         var         bytes    = GetLengthOfWebSocket(stream, ref size);
         var         newBytes = ReadBlockSize(stream, size);
         List <byte> b        = new List <byte>();
         b.AddRange(bytes);
         b.AddRange(newBytes);
         var decode = DecodeMessage(b.ToArray());
         if (decode == null || decode.Length == 0)
         {
             AutoLogger.LogText($"decode zero size: {size} bytes: {ByteArrayToText(bytes.ToArray())} newBytes:{ByteArrayToText(newBytes)} decode: {ByteArrayToText(decode)}");
         }
         return(decode);
     }
     else
     {
         //first 4 bytes are size of block
         var dataLenByte = ReadBlockSize(stream, 4);
         //convert bytes to int
         int dataLength = BitConverter.ToInt32(dataLenByte, 0);
         if (dataLength > maximum)
         {
             throw new Exception("dataLength is upper than maximum :" + dataLength + " " + isWebSocket);
         }
         //else
         //    AutoLogger.LogText("size: " + dataLength);
         //read a block
         var dataBytes = ReadBlockSize(stream, (ulong)dataLength);
         return(dataBytes);
     }
 }
Example #2
0
        /// <summary>
        ///     Compress a given stream with the given compression mode.
        /// </summary>
        /// <param name="stream">       the stream to compress. </param>
        /// <param name="streamOut">    [out] than finished the compressed out stream. </param>
        /// <param name="compressMode"> (Optional) the compression mode. </param>
        /// <returns>
        ///     <c>true</c> if successfully compressed the stream; <c>false</c> otherwise.
        /// </returns>
        /// <exception cref="ArgumentNullException"> Thrown when one or more required arguments are null. </exception>
        /// <exception cref="ArgumentException">
        ///     Thrown when one or more arguments have unsupported or
        ///     illegal values.
        /// </exception>
        public static bool CompressStream(Stream stream,
                                          out Stream streamOut,
                                          CompressMode compressMode = CompressMode.Gzip)
        {
            try
            {
                stream.Position = 0;

                streamOut = new MemoryStream();
                streamOut.Write(s_magicHeader, 0, s_magicHeader.Length);
                streamOut.WriteByte((byte)compressMode);

                switch (compressMode)
                {
                case CompressMode.Gzip:
                    GzipCompress(stream, streamOut);
                    break;

                default: throw new ArgumentException("no compression method found", nameof(compressMode));
                }
            }
            catch
            {
                streamOut = null !;
                return(false);
            }
            return(true);
        }
Example #3
0
        /// <summary>
        /// 字节数组压缩成字节数组
        /// </summary>
        /// <param name="data">压缩前字节数组</param>
        /// <param name="mode">压缩方法<see cref="CompressMode"/></param>
        /// <returns></returns>
        public byte[] Compress(byte[] data, CompressMode mode)
        {
            try
            {
                if (mode == CompressMode.None)
                {
                    return(data);
                }
                using MemoryStream inputStream = new MemoryStream(data);
                using var outputStream         = new MemoryStream();
                if (mode == CompressMode.Deflate)
                {
                    using var compressor = new DeflateStream(outputStream, CompressionMode.Compress, true);
                    inputStream.CopyTo(compressor);
                }
#if NETCOREAPP
                else if (mode == CompressMode.Brotli)
                {
                    using var compressor = new BrotliStream(outputStream, CompressionMode.Compress, true);
                    inputStream.CopyTo(compressor);
                }
#endif
                else
                {
                    using var compressor = new GZipStream(outputStream, CompressionMode.Compress, true);
                    inputStream.CopyTo(compressor);
                }
                return(outputStream.ToArray());
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// Compresses the whole content of a directory structure into the Zip file given with <paramref name="zipFile"/>.
        /// </summary>
        /// <param name="baseDir">The base directory of the ZipFile's content. The directory itself will not be included.</param>
        /// <param name="zipFile">The relative or absolute path to the target zip file.</param>
        /// <param name="compressMode">Sets how the code should handle an already existing ZipFile.</param>
        public void Compress(string baseDir, string zipFile, CompressMode compressMode = CompressMode.Throw)
        {
            if (File.Exists(zipFile))
            {
                switch (compressMode)
                {
                case CompressMode.Throw when File.Exists(zipFile):
                    throw new Exception($"File '{zipFile}' already exists.");

                case CompressMode.Backup:
                    var backupFile = zipFile + ".bak";
                    if (File.Exists(backupFile))
                    {
                        File.Delete(backupFile);
                    }
                    File.Move(zipFile, zipFile + ".bak");
                    break;

                case CompressMode.Overwrite:
                    File.Delete(zipFile);
                    break;
                }
            }

            using (var zip = new ZipFile(zipFile))
            {
                var dir = new DirectoryInfo(baseDir);
                foreach (var file in dir.GetFiles("*", SearchOption.AllDirectories))
                {
                    zip.AddFile(file.FullName, file.DirectoryName.Replace(dir.FullName, String.Empty));
                }
                zip.Save();
            }
        }
Example #5
0
        /// <summary>
        /// 将流压缩成流
        /// </summary>
        /// <param name="data">压缩前的流</param>
        /// <param name="mode">压缩方法<see cref="CompressMode"/></param>
        /// <returns></returns>
        public Stream Compress(Stream data, CompressMode mode)
        {
            try
            {
                if (mode == CompressMode.None)
                {
                    return(data);
                }
                data.Seek(0, SeekOrigin.Begin);
                MemoryStream outputStream = new MemoryStream();
                if (mode == CompressMode.Deflate)
                {
                    using var compressor = new DeflateStream(outputStream, CompressionMode.Compress, true);
                    data.CopyTo(compressor);
                }
#if NETCOREAPP
                else if (mode == CompressMode.Brotli)
                {
                    using var compressor = new BrotliStream(outputStream, CompressionMode.Compress, true);
                    data.CopyTo(compressor);
                }
#endif
                else
                {
                    using var compressor = new GZipStream(outputStream, CompressionMode.Compress, true);
                    data.CopyTo(compressor);
                }
                return(outputStream);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Example #6
0
        public KeyValue <DataType, CompressMode> ReadFirstData(PipeNetworkStream stream, int maximumReceiveStreamHeaderBlock)
        {
            DataType     responseType = (DataType)SignalGoStreamBase.CurrentBase.ReadOneByte(stream);
            CompressMode compressMode = (CompressMode)SignalGoStreamBase.CurrentBase.ReadOneByte(stream);

            return(new KeyValue <DataType, CompressMode>(responseType, compressMode));
        }
Example #7
0
        }         // func OpenWrite

        /// <summary>Erzeugt die angegebene Datei (neu).</summary>
        /// <param name="file">Datei die angelegt werden soll.</param>
        /// <param name="notify">Zugriff auf die UI.</param>
        /// <param name="compressed">Soll die Datei gepackt sein.</param>
        /// <returns></returns>
        public static Stream OpenCreate(this FileInfo file, CmdletNotify notify, CompressMode compressed = CompressMode.Stored)
        {
            if (file.Exists)
            {
                var choices = new Collection <ChoiceDescription>
                {
                    new ChoiceDescription("&Überschreiben"),
                    new ChoiceDescription("&Abbrechen")
                };
                if (notify.UI.PromptForChoice("Überschreiben", $"Datei '{file.Name}' überschreiben?", choices, 0) != 0)
                {
                    notify.Abort();
                }

                notify.SafeIO(file.Delete, $"Datei '{file.Name}' löschen.");
            }

            // Erzeuge die Datei im sicheren Context
            var src = notify.SafeIO(() => OpenWrite(file), $"Datei '{file.Name}' konnte nicht angelegt werden.");

            // Entpacke die Daten automatisch
            if (compressed == CompressMode.Compressed || (compressed == CompressMode.Auto && IsGZipFile(file.Name)))
            {
                return(new GZipStream(src, CompressionMode.Compress, false));
            }
            else
            {
                return(src);
            }
        }         // func OpenCreate
        /// <summary>
        /// 将流解压成流
        /// </summary>
        /// <param name="data">压缩后的流</param>
        /// <param name="mode">压缩方法<see cref="CompressMode"/></param>
        /// <returns></returns>
        public Stream DeCompress(Stream data, CompressMode mode)
        {
            if (mode == CompressMode.None)
            {
                return(data);
            }
            data.Seek(0, SeekOrigin.Begin);
            var outputStream = new MemoryStream();

            if (mode == CompressMode.Deflate)
            {
                using var decompressor = new DeflateStream(data, CompressionMode.Decompress, true);
                decompressor.CopyTo(outputStream);
            }
#if NETCOREAPP
            else if (mode == CompressMode.Brotli)
            {
                using var decompressor = new BrotliStream(data, CompressionMode.Decompress, true);
                decompressor.CopyTo(outputStream);
            }
#endif
            else
            {
                using var decompressor = new GZipStream(data, CompressionMode.Decompress, true);
                decompressor.CopyTo(outputStream);
            }
            return(outputStream);
        }
        /// <summary>
        /// 字节数组解压成字节数组
        /// </summary>
        /// <param name="data">压缩后的字节数组</param>
        /// <param name="mode">压缩方法<see cref="CompressMode"/></param>
        /// <returns></returns>
        public byte[] DeCompress(byte[] data, CompressMode mode)
        {
            if (mode == CompressMode.None)
            {
                return(data);
            }
            using MemoryStream inputStream = new MemoryStream(data);
            using var outputStream         = new MemoryStream();
            if (mode == CompressMode.Deflate)
            {
                using var decompressor = new DeflateStream(inputStream, CompressionMode.Decompress, true);
                decompressor.CopyTo(outputStream);
            }
#if NETCOREAPP
            else if (mode == CompressMode.Brotli)
            {
                using var decompressor = new BrotliStream(inputStream, CompressionMode.Decompress, true);
                decompressor.CopyTo(outputStream);
            }
#endif
            else
            {
                using var decompressor = new GZipStream(inputStream, CompressionMode.Decompress, true);
                decompressor.CopyTo(outputStream);
            }
            return(outputStream.GetBuffer());
        }
Example #10
0
 /// <summary>
 /// 设置压缩方式
 /// </summary>
 /// <param name="compressMode"></param>
 public void SetResponse(CompressMode compressMode)
 {
     this.response            = new Owin.Response();
     this.response.headers    = new Dictionary <string, string[]>(StringComparer.Ordinal);
     this.response.statusCode = 200;
     this.response.stream     = new MemoryStream();
     this.compressMode        = compressMode;
     if (compressMode == CompressMode.None)
     {
         this.writeStream = this.response.stream;
     }
     else
     {
         if (compressMode == CompressMode.GZip)
         {
             this.writeStream = new System.IO.Compression.GZipStream(this.response.stream, System.IO.Compression.CompressionMode.Compress, true);
             this.response.headers.Add(NFinal.Constant.HeaderContentEncoding, NFinal.Constant.HeaderContentEncodingGzip);
         }
         else if (compressMode == CompressMode.Deflate)
         {
             this.writeStream = new System.IO.Compression.DeflateStream(this.response.stream, System.IO.Compression.CompressionMode.Compress, true);
             this.response.headers.Add(NFinal.Constant.HeaderContentEncoding, NFinal.Constant.HeaderContentEncodingDeflate);
         }
     }
 }
        /// <summary>
        /// compress the input data
        /// </summary>
        /// <param name="input">the input data</param>
        /// <param name="compressMode">the compress mode of this compress</param>
        /// <returns>compressed data, if the compressed data is larger than input data, the original data
        /// is returned</returns>
        public byte[] Compress(byte[] input, out CompressMode compressMode)
        {
            if (input == null)
            {
                throw new ArgumentNullException("input");
            }

            compressMode = CompressMode.Compressed;
            if (input.Length > (window8k - slidingWindow.Count))
            {
                compressMode = compressMode | CompressMode.SetToFront;
                hashTable.Clear();
                slidingWindow.Clear();
            }

            CompressCore(input);

            byte[] ret = new byte[outputStream.Length];
            outputStream.Position = 0;
            outputStream.Read(ret, 0, ret.Length);

            //put stream position to 0 for next round compress
            outputStream.SetLength(0);

            if (ret.Length > input.Length)
            {
                compressMode = CompressMode.Flush;
                hashTable.Clear();
                slidingWindow.Clear();
                return(input);
            }

            return(ret);
        }
Example #12
0
        public async Task SetPositionFlushAsync(long position)
        {
            DataType     dataType     = DataType.FlushStream;
            CompressMode compressMode = CompressMode.None;
            await SignalGoStreamBase.CurrentBase.WriteToStreamAsync(Stream, new byte[] { (byte)dataType, (byte)compressMode });

            byte[] data = BitConverter.GetBytes(position);
            await SignalGoStreamBase.CurrentBase.WriteBlockToStreamAsync(Stream, data);
        }
Example #13
0
        /// <summary>
        /// 获取文件实际地址。
        /// </summary>
        /// <param name="path">文件地址</param>
        /// <param name="mode">图片压缩模式</param>
        /// <returns>图像地址</returns>
        public string GetFile(string path, CompressMode mode = CompressMode.Small)
        {
            if (string.IsNullOrWhiteSpace(path))
            {
                return null;
            }

            var id = Convert.ToBase64String(Encoding.UTF8.GetBytes(path));

            return $"{FileRemoteUrl}File/Index/{id}?mode={mode}";
        }
Example #14
0
        public override StreamInfo RegisterFileToDownload(NetworkStream stream, CompressMode compressMode, ClientInfo client, bool isWebSocket)
        {
            var            bytes    = GoStreamReader.ReadBlockToEnd(stream, compressMode, ProviderSetting.MaximumReceiveDataBlock, isWebSocket);
            var            json     = Encoding.UTF8.GetString(bytes);
            MethodCallInfo callInfo = ServerSerializationHelper.Deserialize <MethodCallInfo>(json);

            MethodCallbackInfo callback = new MethodCallbackInfo();

            callback.Guid = callInfo.Guid;

            var serviceType = RegisteredServiceTypes[callInfo.ServiceName];
            var sessionId   = callInfo.Data.ToString();
            var clientInfo  = (from x in Services.ToArray() where x.Key.SessionId == sessionId select x.Key).FirstOrDefault();

            if (clientInfo == null)
            {
                throw new Exception("RegisterFile client not found!");
            }
            var service = FindClientServiceByType(clientInfo, serviceType);

#if (NETSTANDARD1_6 || NETCOREAPP1_1)
            var method = serviceType.GetTypeInfo().GetMethod(callInfo.MethodName, RuntimeTypeHelper.GetMethodTypes(serviceType, callInfo).ToArray());
#else
            var method = serviceType.GetMethod(callInfo.MethodName, RuntimeTypeHelper.GetMethodTypes(serviceType, callInfo).ToArray());
#endif
            List <object> parameters = new List <object>();
            int           index      = 0;
            var           prms       = method.GetParameters();
            foreach (var item in callInfo.Parameters)
            {
                parameters.Add(ServerSerializationHelper.Deserialize(item.Value, prms[index].ParameterType));
                index++;
            }
            if (method.ReturnType != typeof(StreamInfo))
            {
                throw new Exception("return type for upload must StreamInfo!");
            }
            else
            {
                StreamInfo data = null;
                data = (StreamInfo)method.Invoke(service, parameters.ToArray());
                if (data == null)
                {
                    throw new Exception($"StreamInfo cannot be null");
                }
                var streamReader = data.Stream;
                data.Stream   = null;
                callback.Data = ServerSerializationHelper.SerializeObject(data, this);
                SendCallbackData(callback, client);
                data.Stream = streamReader;
                return(data);
            }
        }
Example #15
0
        public FileWrite(CmdletNotify notify, FileInfo file, bool createMode, CompressMode compressed)
        {
            this.notify     = notify;
            this.file       = file;
            this.createMode = createMode;
            this.compressed = compressed;
            this.tempFile   = new FileInfo(Path.Combine(file.Directory.FullName, Guid.NewGuid().ToString("N") + ".tmp"));

            if (compressed == CompressMode.Auto)
            {
                this.compressed = Stuff.IsGZipFile(file.Name) ? CompressMode.Compressed : CompressMode.Stored;
            }
        }         // ctor
Example #16
0
        }         // func OpenCreate

        /// <summary>Öffnet die Datei zum Schreiben.</summary>
        /// <param name="file">Datei die geöffnet werden soll.</param>
        /// <param name="notify">Zugriff auf die UI.</param>
        /// <param name="compressed">Soll die Datei gepackt sein.</param>
        /// <returns></returns>
        public static Stream OpenWrite(this FileInfo file, CmdletNotify notify, CompressMode compressed = CompressMode.Stored)
        {
            // Erzeuge die Datei im sicheren Context
            var src = notify.SafeIO(() => OpenWrite(file), $"Datei '{file.Name}' konnte nicht zum Schreiben geöffnet werden.");

            // Entpacke die Daten automatisch
            if (compressed == CompressMode.Compressed || (compressed == CompressMode.Auto && IsGZipFile(file.Name)))
            {
                return(new GZipStream(src, CompressionMode.Compress, false));
            }
            else
            {
                return(src);
            }
        }         // func OpenWrite
        public virtual byte[] ReadBlockToEnd(PipeNetworkStream stream, CompressMode compress, int maximum)
        {
            //first 4 bytes are size of block
            byte[] dataLenByte = ReadBlockSize(stream, 4);
            //convert bytes to int
            int dataLength = BitConverter.ToInt32(dataLenByte, 0);

            if (dataLength > maximum)
            {
                throw new Exception("dataLength is upper than maximum :" + dataLength);
            }
            //read a block
            byte[] dataBytes = ReadBlockSize(stream, dataLength);
            return(dataBytes);
        }
Example #18
0
 public static void Start(FileStream source, FileStream target, CompressMode mode)
 {
     if (mode == CompressMode.Compress)
     {
         using (GZipStream gzipStream = new GZipStream(target, CompressionLevel.Optimal, true))
         {
             Converter.Convert(source, gzipStream, ConvertMode.Convert);
         }
     }
     else
     {
         using (var gzipStream = new GZipStream(source, CompressionMode.Decompress, true))
         {
             Converter.Convert(gzipStream, target, ConvertMode.Deconvert);
         }
     }
 }
Example #19
0
        }         // func OpenWrite

        /// <summary>Öffnet die Datei zum Lesen.</summary>
        /// <param name="file">Datei die geöffnet werden soll.</param>
        /// <param name="notify">Zugriff auf die UI.</param>
        /// <param name="compressed">Soll die Datei entpackt werden.</param>
        public static Stream OpenRead(this FileInfo file, CmdletNotify notify, CompressMode compressed = CompressMode.Stored, bool allowEmpty = false)
        {
            var desc = $"Datei '{file.Name}' kann nicht geöffnet werden.";
            var src  = allowEmpty ?
                       notify.SafeOpen(OpenRead, file, desc) :
                       notify.SafeIO(() => OpenRead(file), desc);

            // Entpacke die Daten automatisch
            if (compressed == CompressMode.Compressed || (compressed == CompressMode.Auto && IsGZipFile(file.Name)))
            {
                return(new GZipStream(src, CompressionMode.Decompress, false));
            }
            else
            {
                return(src);
            }
        }         // func OpenRead
Example #20
0
 /// <summary>
 /// read one byte from server
 /// </summary>
 /// <param name="stream">stream to read</param>
 /// <param name="compress">compress mode</param>
 /// <param name="maximum">maximum read</param>
 /// <param name="isWebSocket">if reading socket is websocket</param>
 /// <returns></returns>
 public static byte ReadOneByte(NetworkStream stream, CompressMode compress, uint maximum, bool isWebSocket)
 {
     byte[] dataBytes = null;
     if (isWebSocket)
     {
         dataBytes = ReadBlockToEnd(stream, compress, maximum, isWebSocket);
     }
     else
     {
         var data = stream.ReadByte();
         if (data < 0)
         {
             throw new Exception($"read one byte is correct or disconnected client! {data}");
         }
         return((byte)data);
     }
     return(dataBytes[0]);
 }
Example #21
0
 private static byte[] Compress(Stream input, CompressMode mode)
 {
     if (mode == CompressMode.Deflate)
     {
         using (var compressStream = new MemoryStream())
             using (var compressor = new DeflateStream(compressStream, CompressionMode.Compress))
             {
                 input.CopyTo(compressor);
                 return(compressStream.ToArray());
             }
     }
     else
     {
         using (var compressStream = new MemoryStream())
             using (var compressor = new GZipStream(compressStream, CompressionMode.Compress))
             {
                 input.CopyTo(compressor);
                 return(compressStream.ToArray());
             }
     }
 }
Example #22
0
 /// <summary>
 /// HtmlWriter类初始化
 /// </summary>
 /// <param name="stream"></param>
 /// <param name="compressMode"></param>
 public HtmlWriter(Stream stream, CompressMode compressMode)
 {
     this.compressMode        = compressMode;
     this.response            = new Response();
     this.response.statusCode = 200;
     this.response.headers    = new Dictionary <string, string[]>(StringComparer.Ordinal);
     this.setCookies          = new Dictionary <string, string>(StringComparer.Ordinal);
     this.response.stream     = stream;
     if (compressMode == CompressMode.GZip)
     {
         this.writeStream = new System.IO.Compression.GZipStream(this.response.stream, System.IO.Compression.CompressionMode.Compress, true);
         this.response.headers.Add(NFinal.Constant.HeaderContentEncoding, NFinal.Constant.HeaderContentEncodingGzip);
     }
     else if (compressMode == CompressMode.Deflate)
     {
         this.writeStream = new System.IO.Compression.DeflateStream(this.response.stream, System.IO.Compression.CompressionMode.Compress, true);
         this.response.headers.Add(NFinal.Constant.HeaderContentEncoding, NFinal.Constant.HeaderContentEncodingDeflate);
     }
     else
     {
         this.writeStream = this.response.stream;
     }
 }
Example #23
0
        private static byte[] Decompress(byte[] input, CompressMode mode)
        {
            var output = new MemoryStream();

            if (mode == CompressMode.Deflate)
            {
                using (var compressStream = new MemoryStream(input))
                    using (var decompressor = new DeflateStream(compressStream, CompressionMode.Decompress))
                        decompressor.CopyTo(output);

                output.Position = 0;
                return(output.ToArray());
            }
            else
            {
                using (var compressStream = new MemoryStream(input))
                    using (var decompressor = new DeflateStream(compressStream, CompressionMode.Decompress))
                        decompressor.CopyTo(output);

                output.Position = 0;
                return(output.ToArray());
            }
        }
        /// <summary>
        /// Decompress input data
        /// </summary>
        /// <param name="input">input</param>
        /// <param name="compressMode">the compress mode</param>
        /// <returns>decompressed data</returns>
        public byte[] Decompress(byte[] input, CompressMode compressMode)
        {
            if (input == null)
            {
                throw new ArgumentNullException("input");
            }

            if (((compressMode & ~CompressMode.Flush) != 0) && ((compressMode & CompressMode.Flush) != 0))
            {
                throw new ArgumentException("invalid flag. CompressMode.Flush can't be mixed with others");
            }

            if ((compressMode & CompressMode.Flush) == CompressMode.Flush ||
                (compressMode & CompressMode.SetToFront) == CompressMode.SetToFront)
            {
                InitializeAll();
            }

            if ((compressMode & CompressMode.Compressed) != CompressMode.Compressed)
            {
                return((byte[])input.Clone());
            }

            DecompressCore(input);
            DecompressFinnal();
            byte[] ret = new byte[outputStream.Length];
            outputStream.Position = 0;
            outputStream.Read(ret, 0, ret.Length);
            remain          = 0;
            remainBitsCount = 0;

            //set stream length to 0 for next round compress
            outputStream.SetLength(0);

            return(ret);
        }
        /// <summary>
        /// Decompress input data
        /// </summary>
        /// <param name="input">input</param>
        /// <param name="compressMode">the compress mode</param>
        /// <returns>decompressed data</returns>
        public byte[] Decompress(byte[] input, CompressMode compressMode)
        {
            if (input == null)
            {
                throw new ArgumentNullException("input");
            }

            if (((compressMode & ~CompressMode.Flush) != 0) && ((compressMode & CompressMode.Flush) != 0))
            {
                throw new ArgumentException("invalid flag. CompressMode.Flush can't be mixed with others");
            }

            if ((compressMode & CompressMode.Flush) == CompressMode.Flush
                || (compressMode & CompressMode.SetToFront) == CompressMode.SetToFront)
            {
                InitializeAll();
            }

            if ((compressMode & CompressMode.Compressed) != CompressMode.Compressed)
            {
                return (byte[])input.Clone();
            }

            DecompressCore(input);
            DecompressFinnal();
            byte[] ret = new byte[outputStream.Length];
            outputStream.Position = 0;
            outputStream.Read(ret, 0, ret.Length);
            remain = 0;
            remainBitsCount = 0;

            //set stream length to 0 for next round compress
            outputStream.SetLength(0);

            return ret;
        }
Example #26
0
 /// <summary>
 /// 字节数组解压成字符串,默认使用UTF8编码
 /// </summary>
 /// <param name="data">要解压的字节数组</param>
 /// <param name="mode">压缩方法<see cref="CompressMode"/></param>
 /// <returns></returns>
 public string DeCompressFromByte(byte[] data, CompressMode mode) => DeCompress(data, mode).BytesToString(Encoding.UTF8);
Example #27
0
 /// <summary>
 /// 字符串压缩成Base64字符串,可设置编码
 /// </summary>
 /// <param name="data">要压缩的字符串</param>
 /// <param name="mode">压缩方法<see cref="CompressMode"/></param>
 /// <param name="encoding">编码</param>
 /// <returns></returns>
 public string CompressToBase64(string data, CompressMode mode, Encoding encoding) => Compress(data.ToBytes(encoding), mode).ToBase64();
Example #28
0
        public ActionResult Index(string id, CompressMode mode = CompressMode.Small)
        {
            var bytes = id.ToCharArray();
            var base64Bytes = Convert.FromBase64CharArray(bytes, 0, bytes.Length);
            var rsp = this.FileService.GetFileByPath(Encoding.UTF8.GetString(base64Bytes));

            if (rsp.Data != null)
            {
                var filePath = Server.MapPath(rsp.Data.SavedPath);

                if (!System.IO.File.Exists(filePath))
                {
                    return View("Error", model: "文件不存在!");
                }

                if (mode != CompressMode.Original && ImageMimes.Contains(rsp.Data.ContentType))
                {
                    // 源图像的信息
                    var img = Image.FromFile(filePath);

                    // 返回调整后的图像Width与Height
                    var newSize = NewSize(mode, img.Width, img.Height);

                    if (newSize.Width >= img.Width || newSize.Height >= img.Height)
                    {
                        img.Dispose();

                        return File(filePath, rsp.Data.ContentType, rsp.Data.Name);
                    }

                    var compressionPath = this.GetCompressionImage(mode, filePath);

                    if (System.IO.File.Exists(compressionPath))
                    {
                        return File(compressionPath, rsp.Data.ContentType, rsp.Data.Name);
                    }

                    // 源图像的格式
                    var thisformat = img.RawFormat;
                    var outBmp = new Bitmap(newSize.Width, newSize.Height);

                    using (var g = Graphics.FromImage(outBmp))
                    {
                        // 设置画布的描绘质量
                        g.CompositingQuality = CompositingQuality.HighQuality;
                        g.SmoothingMode = SmoothingMode.HighQuality;
                        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                        g.DrawImage(img, new Rectangle(0, 0, newSize.Width, newSize.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel);
                        g.Dispose();
                    }

                    // 以下代码为保存图片时,设置压缩质量
                    var encoderParams = new EncoderParameters();
                    var quality = new long[1];
                    quality[0] = 100;

                    var encoderParam = new EncoderParameter(Encoder.Quality, quality);
                    encoderParams.Param[0] = encoderParam;

                    // 获取包含有关内置图像编码解码器的信息的ImageCodecInfo对象。
                    var arrayICI = ImageCodecInfo.GetImageEncoders();
                    ImageCodecInfo jpegICI = null;

                    for (var x = 0; x < arrayICI.Length; x++)
                    {
                        if (arrayICI[x].FormatDescription.Equals("JPEG"))
                        {
                            // 设置jpeg编码
                            jpegICI = arrayICI[x];

                            break;
                        }
                    }

                    if (jpegICI == null)
                    {
                        outBmp.Save(compressionPath, thisformat);
                    }
                    else
                    {
                        outBmp.Save(compressionPath, jpegICI, encoderParams);
                    }

                    outBmp.Dispose();
                    img.Dispose();

                    return File(compressionPath, rsp.Data.ContentType, rsp.Data.Name);
                }

                return File(filePath, rsp.Data.ContentType, rsp.Data.Name);
            }

            return View("Error", model: rsp.IsSuccess ? "文件不存在!" : rsp.ErrorMessage);
        }
Example #29
0
 /// <summary>
 /// 字节数组解压成字符串,可设置编码
 /// </summary>
 /// <param name="data">要解压的字节数组</param>
 /// <param name="mode">压缩方法<see cref="CompressMode"/></param>
 /// <param name="encoding">编码</param>
 /// <returns></returns>
 public string DeCompressFromByte(byte[] data, CompressMode mode, Encoding encoding) => DeCompress(data, mode).BytesToString(encoding);
Example #30
0
        private static Size NewSize(CompressMode mode, int width, int height)
        {
            var maxWidth = width;
            var maxHeight = height;

            switch (mode)
            {
                case CompressMode.Small:
                    maxWidth = 400;
                    maxHeight = 300;

                    break;

                case CompressMode.Medium:
                    maxWidth = 800;
                    maxHeight = 600;

                    break;

                case CompressMode.Large:
                    maxWidth = 1024;
                    maxHeight = 768;

                    break;
            }

            var w = 0.0;
            var h = 0.0;
            var sw = Convert.ToDouble(width);
            var sh = Convert.ToDouble(height);
            var mw = Convert.ToDouble(maxWidth);
            var mh = Convert.ToDouble(maxHeight);

            // 如果maxWidth和maxHeight大于源图像,则缩略图的长和高不变
            if (sw < mw && sh < mh)
            {
                w = sw;
                h = sh;
            }
            else if ((sw / sh) > (mw / mh))
            {
                w = maxWidth;
                h = (w * sh) / sw;
            }
            else
            {
                h = maxHeight;
                w = (h * sw) / sh;
            }

            return new Size(Convert.ToInt32(w), Convert.ToInt32(h));
        }
Example #31
0
        private string GetCompressionImage(CompressMode mode, string file)
        {
            var directory = $@"{Path.GetDirectoryName(file)}\Compression";

            if (!Directory.Exists(directory))
            {
                Directory.CreateDirectory(directory);
            }

            return $@"{directory}\{mode}_{Path.GetFileName(file)}";
        }
Example #32
0
 /// <summary>
 /// Base64字符串解压成字符串,可设置编码
 /// </summary>
 /// <param name="data">要压缩的Base64字符串</param>
 /// <param name="mode">压缩方法CompressMode</param>
 /// <param name="encoding">编码</param>
 /// <returns></returns>
 public string DeCompressFromBase64(string data, CompressMode mode, Encoding encoding) => DeCompressFromByte(data.Base64ToBytes(), mode, encoding);
Example #33
0
 /// <summary>
 /// Base64字符串解压成字符串,默认使用UTF8编码
 /// </summary>
 /// <param name="data">要解压的Base64字符串</param>
 /// <param name="mode">压缩方法<see cref="CompressMode"/></param>
 /// <returns></returns>
 public string DeCompressFromBase64(string data, CompressMode mode) => DeCompressFromByte(data.Base64ToBytes(), mode);
Example #34
0
        /// <summary>
        /// 流输出初始化函数
        /// </summary>
        /// <param param name="plugConfig">插件配置</param>
        /// <param name="methodName">行为名称</param>
        /// <param name="context">Http上下文</param>
        /// <param name="outputStream">输出流</param>
        /// <param name="request"></param>
        /// <param name="compressMode"></param>
        public override void Initialization(HttpContext context, string methodName, Stream outputStream, HttpRequest request, CompressMode compressMode, NFinal.Config.Plug.PlugConfig plugConfig)
        {
            base.Initialization(context, methodName, outputStream, request, compressMode, plugConfig);
            this.parameters = new NFinal.NameValueCollection();
            foreach (var query in request.Query)
            {
                this.parameters.Add(query.Key, query.Value);
            }
            if (context.Request.HasFormContentType)
            {
                foreach (var form in context.Request.Form)
                {
                    this.parameters.Add(form.Key, form.Value);
                }
            }
            IDictionary <string, string> requestCookie = new Dictionary <string, string>();

            foreach (var cookie in this.request.Cookies)
            {
                requestCookie.Add(cookie.Key, cookie.Value);
            }

            this.Cookie  = new Cookie(requestCookie);
            this.Session = GetSession(Cookie.SessionId);
            if (outputStream == null)
            {
                this.outputStream = context.Response.Body;
            }
            else
            {
                this.outputStream = outputStream;
            }
        }
Example #35
0
        public static async Task StartToReadingClientData(ClientInfo client, ServerBase serverBase)
        {
            try
            {
                Console.WriteLine($"WebSocket Client Connected: {client.IPAddress}");
                Shared.IO.PipeNetworkStream stream = client.ClientStream;
                while (true)
                {
                    byte oneByteOfDataType = await client.StreamHelper.ReadOneByteAsync(stream);

                    //type of data
                    DataType dataType = (DataType)oneByteOfDataType;
                    if (dataType == DataType.PingPong)
                    {
                        await client.StreamHelper.WriteToStreamAsync(client.ClientStream, new byte[] { 5 });

                        continue;
                    }
                    //compress mode of data
                    CompressMode compressMode = (CompressMode)await client.StreamHelper.ReadOneByteAsync(stream);

                    //a server service method called from client
                    if (dataType == DataType.CallMethod)
                    {
                        string json = "";
                        //if (client.IsOwinClient)
                        //{
                        //    json = await stream.ReadLineAsync("#end");
                        //    if (json.EndsWith("#end"))
                        //        json = json.Substring(0, json.Length - 4);
                        //}
                        //else
                        //{
                        byte[] bytes = await client.StreamHelper.ReadBlockToEndAsync(stream, compressMode, serverBase.ProviderSetting.MaximumReceiveDataBlock);

                        //if (ClientsSettings.ContainsKey(client))
                        //    bytes = DecryptBytes(bytes, client);
                        json = Encoding.UTF8.GetString(bytes);
                        //}
                        MethodCallInfo callInfo = ServerSerializationHelper.Deserialize <MethodCallInfo>(json, serverBase);
                        if (callInfo.PartNumber != 0)
                        {
                            SegmentManager segmentManager = new SegmentManager();
                            ISegment       result         = segmentManager.GenerateAndMixSegments(callInfo);
                            if (result != null)
                            {
                                callInfo = (MethodCallInfo)result;
                            }
                            else
                            {
                                continue;
                            }
                        }
#if (NET35 || NET40)
                        MethodCallbackInfo callbackResult = CallMethod(callInfo, client, json, serverBase).Result;
                        SendCallbackData(callbackResult, client, serverBase);
#else
                        Task <MethodCallbackInfo> callbackResult = CallMethod(callInfo, client, json, serverBase);
                        SendCallbackData(callbackResult, client, serverBase);
#endif
                    }

                    //reponse of client method that server called to client
                    else if (dataType == DataType.ResponseCallMethod)
                    {
                        byte[] bytes = await client.StreamHelper.ReadBlockToEndAsync(stream, compressMode, serverBase.ProviderSetting.MaximumReceiveDataBlock);

                        //if (ClientsSettings.ContainsKey(client))
                        //    bytes = DecryptBytes(bytes, client);
                        string             json     = Encoding.UTF8.GetString(bytes);
                        MethodCallbackInfo callback = ServerSerializationHelper.Deserialize <MethodCallbackInfo>(json, serverBase);
                        if (callback == null)
                        {
                            serverBase.AutoLogger.LogText($"{client.IPAddress} {client.ClientId} callback is null:" + json);
                        }
                        if (callback.PartNumber != 0)
                        {
                            SegmentManager segmentManager = new SegmentManager();
                            ISegment       result         = segmentManager.GenerateAndMixSegments(callback);
                            if (result != null)
                            {
                                callback = (MethodCallbackInfo)result;
                            }
                            else
                            {
                                continue;
                            }
                        }
                        if (serverBase.ClientServiceCallMethodsResult.TryGetValue(callback.Guid, out KeyValue <Type, object> resultTask))
                        {
                            if (callback.IsException)
                            {
                                resultTask.Value.GetType().FindMethod("SetException").Invoke(resultTask.Value, new object[] { new Exception(callback.Data) });
                            }
                            else
                            {
                                resultTask.Value.GetType().FindMethod("SetResult").Invoke(resultTask.Value, new object[] { ServerSerializationHelper.Deserialize(callback.Data, resultTask.Key, serverBase) });
                            }
                        }
                    }
                    else if (dataType == DataType.GetServiceDetails)
                    {
                        byte[] bytes = await client.StreamHelper.ReadBlockToEndAsync(stream, compressMode, serverBase.ProviderSetting.MaximumReceiveDataBlock);

                        //if (ClientsSettings.ContainsKey(client))
                        //    bytes = DecryptBytes(bytes, client);
                        string json    = Encoding.UTF8.GetString(bytes);
                        string hostUrl = ServerSerializationHelper.Deserialize <string>(json, serverBase);
                        ServerServicesManager serverServicesManager = new ServerServicesManager();
                        ProviderDetailsInfo   detail = serverServicesManager.SendServiceDetail(hostUrl, serverBase);
                        json = ServerSerializationHelper.SerializeObject(detail, serverBase);
                        List <byte> resultBytes = new List <byte>
                        {
                            (byte)DataType.GetServiceDetails,
                            (byte)CompressMode.None
                        };
                        byte[] jsonBytes = Encoding.UTF8.GetBytes(json);
                        byte[] dataLen   = BitConverter.GetBytes(jsonBytes.Length);
                        resultBytes.AddRange(dataLen);
                        resultBytes.AddRange(jsonBytes);
                        await client.StreamHelper.WriteToStreamAsync(client.ClientStream, resultBytes.ToArray());
                    }
                    else if (dataType == DataType.GetMethodParameterDetails)
                    {
                        byte[] bytes = await client.StreamHelper.ReadBlockToEndAsync(stream, compressMode, serverBase.ProviderSetting.MaximumReceiveDataBlock);

                        //if (ClientsSettings.ContainsKey(client))
                        //    bytes = DecryptBytes(bytes, client);
                        string json = Encoding.UTF8.GetString(bytes);
                        MethodParameterDetails detail = ServerSerializationHelper.Deserialize <MethodParameterDetails>(json, serverBase);

                        if (!serverBase.RegisteredServiceTypes.TryGetValue(detail.ServiceName, out Type serviceType))
                        {
                            throw new Exception($"{client.IPAddress} {client.ClientId} Service {detail.ServiceName} not found");
                        }
                        if (serviceType == null)
                        {
                            throw new Exception($"{client.IPAddress} {client.ClientId} serviceType {detail.ServiceName} not found");
                        }

                        ServerServicesManager serverServicesManager = new ServerServicesManager();

                        json = serverServicesManager.SendMethodParameterDetail(serviceType, detail, serverBase);
                        List <byte> resultBytes = new List <byte>
                        {
                            (byte)DataType.GetMethodParameterDetails,
                            (byte)CompressMode.None
                        };

                        byte[] jsonBytes = Encoding.UTF8.GetBytes(json);
                        byte[] dataLen   = BitConverter.GetBytes(jsonBytes.Length);
                        resultBytes.AddRange(dataLen);
                        resultBytes.AddRange(jsonBytes);
                        await client.StreamHelper.WriteToStreamAsync(client.ClientStream, resultBytes.ToArray());
                    }
                    else if (dataType == DataType.GetClientId)
                    {
                        byte[]      bytes  = Encoding.UTF8.GetBytes(client.ClientId);
                        List <byte> result = new List <byte>();
                        result.Add((byte)DataType.GetClientId);
                        result.Add((byte)CompressMode.None);

                        result.AddRange(BitConverter.GetBytes(bytes.Length));
                        result.AddRange(bytes);
                        //if (ClientsSettings.ContainsKey(client))
                        //    bytes = EncryptBytes(bytes, client);
                        if (result.Count > serverBase.ProviderSetting.MaximumSendDataBlock)
                        {
                            throw new Exception($"{client.IPAddress} {client.ClientId} GetClientId data length exceeds MaximumSendDataBlock");
                        }

                        await client.StreamHelper.WriteToStreamAsync(client.ClientStream, result.ToArray());
                    }
                    else
                    {
                        //throw new Exception($"Correct DataType Data {dataType}");
                        serverBase.AutoLogger.LogText($"Correct DataType Data {oneByteOfDataType} {client.ClientId} {client.IPAddress}");
                        break;
                    }
                }
                serverBase.DisposeClient(client, null, "StartToReadingClientData while break");
            }
            catch (Exception ex)
            {
                serverBase.AutoLogger.LogError(ex, $"{client.IPAddress} {client.ClientId} ServerBase SignalGoDuplexServiceProvider StartToReadingClientData");
                serverBase.DisposeClient(client, null, "SignalGoDuplexServiceProvider StartToReadingClientData exception");
            }
        }
Example #36
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="filePath"></param>
 /// <param name="mode"></param>
 /// <returns></returns>
 public static string GetFileUrl(string filePath, CompressMode mode = CompressMode.Small)
 {
     return string.IsNullOrEmpty(filePath) ? string.Empty : _FileStorageClient.GetFile(filePath, mode);
 }
Example #37
0
 /// <summary>
 /// 获取文件URL。
 /// </summary>
 /// <param name="url">Url帮助器</param>
 /// <param name="filePath">文件地址</param>
 /// <param name="mode">图片压缩模式</param>
 /// <returns>文件URL</returns>
 public static string GetFileUrl(this UrlHelper url, string filePath, CompressMode mode = CompressMode.Small)
 {
     return string.IsNullOrEmpty(filePath)
         ? string.Empty
         : url.Content(_FileStorageClient.GetFile(filePath, mode));
 }
        /// <summary>
        /// compress the input data
        /// </summary>
        /// <param name="input">the input data</param>
        /// <param name="compressMode">the compress mode of this compress</param>
        /// <returns>compressed data, if the compressed data is larger than input data, the original data
        /// is returned</returns>
        public byte[] Compress(byte[] input, out CompressMode compressMode)
        {
            if (input == null)
            {
                throw new ArgumentNullException("input");
            }

            compressMode = CompressMode.Compressed;
            if (input.Length > (window8k - slidingWindow.Count))
            {
                compressMode = compressMode | CompressMode.SetToFront;
                hashTable.Clear();
                slidingWindow.Clear();
            }

            CompressCore(input);

            byte[] ret = new byte[outputStream.Length];
            outputStream.Position = 0;
            outputStream.Read(ret, 0, ret.Length);

            //put stream position to 0 for next round compress
            outputStream.SetLength(0);

            if (ret.Length > input.Length)
            {
                compressMode = CompressMode.Flush;
                hashTable.Clear();
                slidingWindow.Clear();
                return input;
            }

            return ret;
        }