| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 | 
							- using System;
 
- using System.IO;
 
- public sealed class HttpPostedFile : IDisposable
 
- {
 
-     private string _name;
 
-     private string _contentType;
 
-     private Stream _stream;
 
-     private bool _disposed = false;
 
-     internal HttpPostedFile(string name, string content_type, Stream base_stream, long offset, long length)
 
-     {
 
-         _name = name;
 
-         _contentType = content_type;
 
-         _stream = new ReadSubStream(base_stream, offset, length);
 
-     }
 
-     public string ContentType => _contentType;
 
-     public int ContentLength => (int)_stream.Length;
 
-     public string FileName => _name;
 
-     public Stream InputStream => _stream;
 
-     /// <summary>
 
-     /// Releases the unmanaged resources and disposes of the managed resources used.
 
-     /// </summary>
 
-     public void Dispose()
 
-     {
 
-         if (_disposed)
 
-         {
 
-             return;
 
-         }
 
-         _stream.Dispose();
 
-         _stream = null;
 
-         _name = null;
 
-         _contentType = null;
 
-         _disposed = true;
 
-     }
 
-     private class ReadSubStream : Stream
 
-     {
 
-         private Stream _stream;
 
-         private long _offset;
 
-         private long _end;
 
-         private long _position;
 
-         public ReadSubStream(Stream s, long offset, long length)
 
-         {
 
-             _stream = s;
 
-             _offset = offset;
 
-             _end = offset + length;
 
-             _position = offset;
 
-         }
 
-         public override bool CanRead => true;
 
-         public override bool CanSeek => true;
 
-         public override bool CanWrite => false;
 
-         public override long Length => _end - _offset;
 
-         public override long Position
 
-         {
 
-             get => _position - _offset;
 
-             set
 
-             {
 
-                 if (value > Length)
 
-                 {
 
-                     throw new ArgumentOutOfRangeException(nameof(value));
 
-                 }
 
-                 _position = Seek(value, SeekOrigin.Begin);
 
-             }
 
-         }
 
-         public override void Flush()
 
-         {
 
-         }
 
-         public override int Read(byte[] buffer, int dest_offset, int count)
 
-         {
 
-             if (buffer == null)
 
-             {
 
-                 throw new ArgumentNullException(nameof(buffer));
 
-             }
 
-             if (dest_offset < 0)
 
-             {
 
-                 throw new ArgumentOutOfRangeException(nameof(dest_offset), "< 0");
 
-             }
 
-             if (count < 0)
 
-             {
 
-                 throw new ArgumentOutOfRangeException(nameof(count), "< 0");
 
-             }
 
-             int len = buffer.Length;
 
-             if (dest_offset > len)
 
-             {
 
-                 throw new ArgumentException("destination offset is beyond array size", nameof(dest_offset));
 
-             }
 
-             // reordered to avoid possible integer overflow
 
-             if (dest_offset > len - count)
 
-             {
 
-                 throw new ArgumentException("Reading would overrun buffer", nameof(count));
 
-             }
 
-             if (count > _end - _position)
 
-             {
 
-                 count = (int)(_end - _position);
 
-             }
 
-             if (count <= 0)
 
-             {
 
-                 return 0;
 
-             }
 
-             _stream.Position = _position;
 
-             int result = _stream.Read(buffer, dest_offset, count);
 
-             if (result > 0)
 
-             {
 
-                 _position += result;
 
-             }
 
-             else
 
-             {
 
-                 _position = _end;
 
-             }
 
-             return result;
 
-         }
 
-         public override int ReadByte()
 
-         {
 
-             if (_position >= _end)
 
-             {
 
-                 return -1;
 
-             }
 
-             _stream.Position = _position;
 
-             int result = _stream.ReadByte();
 
-             if (result < 0)
 
-             {
 
-                 _position = _end;
 
-             }
 
-             else
 
-             {
 
-                 _position++;
 
-             }
 
-             return result;
 
-         }
 
-         public override long Seek(long d, SeekOrigin origin)
 
-         {
 
-             long real;
 
-             switch (origin)
 
-             {
 
-                 case SeekOrigin.Begin:
 
-                     real = _offset + d;
 
-                     break;
 
-                 case SeekOrigin.End:
 
-                     real = _end + d;
 
-                     break;
 
-                 case SeekOrigin.Current:
 
-                     real = _position + d;
 
-                     break;
 
-                 default:
 
-                     throw new ArgumentException("Unknown SeekOrigin value", nameof(origin));
 
-             }
 
-             long virt = real - _offset;
 
-             if (virt < 0 || virt > Length)
 
-             {
 
-                 throw new ArgumentException("Invalid position", nameof(d));
 
-             }
 
-             _position = _stream.Seek(real, SeekOrigin.Begin);
 
-             return _position;
 
-         }
 
-         public override void SetLength(long value)
 
-         {
 
-             throw new NotSupportedException();
 
-         }
 
-         public override void Write(byte[] buffer, int offset, int count)
 
-         {
 
-             throw new NotSupportedException();
 
-         }
 
-     }
 
- }
 
 
  |