Beispiel #1
0
            private Zongsoft.IO.FileInfo GenerateInfo(string path, IDictionary <string, object> properties)
            {
                if (properties == null)
                {
                    return(null);
                }

                DateTimeOffset createdTimeOffset, modifiedTimeOffset;
                DateTime?      createdTime = null, modifiedTime = null;
                int            size = 0;

                byte[] checksum = null;
                object value;

                if (properties.TryGetValue(StorageHeaders.ZFS_CREATEDTIME_PROPERTY, out value))
                {
                    if (Zongsoft.Common.Convert.TryConvertValue(value, out createdTimeOffset))
                    {
                        createdTime = createdTimeOffset.LocalDateTime;
                    }
                }

                if (properties.TryGetValue(StorageHeaders.HTTP_LAST_MODIFIED_PROPERTY, out value))
                {
                    if (Zongsoft.Common.Convert.TryConvertValue(value, out modifiedTimeOffset))
                    {
                        modifiedTime = modifiedTimeOffset.LocalDateTime;
                    }
                }

                if (properties.TryGetValue(StorageHeaders.HTTP_CONTENT_LENGTH_PROPERTY, out value))
                {
                    Zongsoft.Common.Convert.TryConvertValue(value, out size);
                }

                if (properties.TryGetValue(StorageHeaders.HTTP_ETAG_PROPERTY, out value) && value != null)
                {
                    checksum = Zongsoft.Common.Convert.FromHexString(value.ToString().Trim('"'), '-');
                }

                var info = new Zongsoft.IO.FileInfo(path, size, checksum, createdTime, modifiedTime, _fileSystem.GetUrl(path));

                foreach (var property in properties)
                {
                    info.Properties[property.Key] = property.Value;
                }

                return(info);
            }
Beispiel #2
0
            public override Stream GetStream(HttpContent parent, HttpContentHeaders headers)
            {
                if (parent == null)
                {
                    throw new ArgumentNullException(nameof(parent));
                }
                if (headers == null)
                {
                    throw new ArgumentNullException(nameof(headers));
                }

                //判断当前内容项是否为普通表单域,如果是则返回一个内存流
                if (headers.ContentDisposition == null || string.IsNullOrEmpty(headers.ContentDisposition.FileName))
                {
                    //在表单数据标记列表中按顺序将当前内容标记为普通表单域
                    _isFormData.Add(true);

                    //返回一个新的内存流
                    return(new MemoryStream());
                }

                //获取当前内容项的内容类型
                var contentType = headers.ContentType == null ? string.Empty : headers.ContentType.MediaType;

                if (string.IsNullOrWhiteSpace(contentType))
                {
                    contentType = System.Web.MimeMapping.GetMimeMapping(headers.ContentDisposition.FileName);
                }

                string fileName = null;

                //设置文件名的初始值
                if (_filePath[_filePath.Length - 1] != '/')
                {
                    var index = _filePath.LastIndexOf('/');

                    if (index > 0 && index < _filePath.Length - 1)
                    {
                        fileName = _filePath.Substring(index + 1);
                    }
                }

                var dispositionName = UnquoteToken(headers.ContentDisposition.Name);
                var extensionName   = System.IO.Path.GetExtension(UnquoteToken(headers.ContentDisposition.FileName));

                if (!string.IsNullOrWhiteSpace(dispositionName))
                {
                    //获取请求头中显式指定的文件名(注意:该文件名支持模板格式)
                    if (_headers.TryGetValue(dispositionName + ".name", out var value))
                    {
                        fileName = Zongsoft.Text.TemplateEvaluatorManager.Default.Evaluate <string>(value, null).ToLowerInvariant() + extensionName;
                    }
                }

                //定义文件写入的模式
                bool overwrite = false;

                //定义文件的扩展名是否自动添加
                bool extensionAppend = true;

                //执行写入前的回调方法
                if (_onWriting != null)
                {
                    //创建回调参数
                    var args = new WritingEventArgs(_filePath, fileName, Interlocked.Increment(ref _index));

                    //执行写入前的回调
                    _onWriting(args);

                    if (args.Cancel)
                    {
                        return(null);
                    }

                    //获取文件写入参数
                    fileName        = args.FileName;
                    overwrite       = args.Overwrite;
                    extensionAppend = args.ExtensionAppend;
                }

                //如果文件名为空,则生成一个以“时间戳-随机数.ext”的默认文件名
                if (string.IsNullOrWhiteSpace(fileName))
                {
                    fileName = string.Format("X{0}-{1}{2}", ((long)(DateTime.UtcNow - EPOCH).TotalSeconds).ToString(), Zongsoft.Common.Randomizer.GenerateString(), extensionAppend ? extensionName : string.Empty);
                }
                else if (extensionAppend && !fileName.EndsWith(extensionName))
                {
                    fileName += extensionName;
                }

                //生成文件的完整路径
                var filePath = Zongsoft.IO.Path.Combine(_directory, fileName);

                //生成文件信息的描述实体
                var fileInfo = new Zongsoft.IO.FileInfo(filePath, (headers.ContentDisposition.Size.HasValue ? headers.ContentDisposition.Size.Value : -1), DateTime.Now, null, FileSystem.GetUrl(filePath))
                {
                    Type = contentType,
                };

                //将上传的文件项的键名加入到文件描述实体的扩展属性中
                if (!string.IsNullOrWhiteSpace(dispositionName))
                {
                    fileInfo.Properties.Add(EXTENDED_PROPERTY_DISPOSITIONNAME, dispositionName);
                }

                //将上传的原始文件名加入到文件描述实体的扩展属性中
                fileInfo.Properties.Add(EXTENDED_PROPERTY_FILENAME, Uri.UnescapeDataString(UnquoteToken(headers.ContentDisposition.FileName)));

                if (_headers != null && _headers.Count > 0 && !string.IsNullOrWhiteSpace(dispositionName))
                {
                    //从全局头里面查找当前上传文件的自定义属性
                    foreach (var header in _headers)
                    {
                        if (header.Key.Length > dispositionName.Length + 1 && header.Key.StartsWith(dispositionName + "-", StringComparison.OrdinalIgnoreCase))
                        {
                            fileInfo.Properties.Add(header.Key.Substring(dispositionName.Length + 1), header.Value);
                        }
                    }
                }

                //将文件信息对象加入到集合中
                _fileData.Add(fileInfo);

                //在表单数据标记列表中按顺序将当前内容标记为非普通表单域(即二进制文件域)
                _isFormData.Add(false);

                try
                {
                    //调用文件系统根据完整文件路径去创建一个新建文件流
                    var stream = FileSystem.File.Open(filePath, (overwrite ? FileMode.Create : FileMode.CreateNew), FileAccess.Write, (fileInfo.HasProperties ? fileInfo.Properties : null));

                    fileInfo.Properties.Add(EXTENDED_PROPERTY_FILESTREAM, stream);

                    return(stream);
                }
                catch
                {
                    if (fileInfo != null)
                    {
                        _fileData.Remove(fileInfo);
                    }

                    throw;
                }
            }
			private Zongsoft.IO.FileInfo GenerateInfo(string path, IDictionary<string, string> properties)
			{
				if(properties == null)
					return null;

				DateTimeOffset createdTimeOffset, modifiedTimeOffset;
				DateTime? createdTime = null, modifiedTime = null;
				int size = 0;
				byte[] checksum = null;
				string text;

				if(properties.TryGetValue(StorageHeaders.ZFS_CREATEDTIME_PROPERTY, out text))
				{
					if(Zongsoft.Common.Convert.TryConvertValue(text, out createdTimeOffset))
						createdTime = createdTimeOffset.LocalDateTime;
				}

				if(properties.TryGetValue(StorageHeaders.HTTP_LAST_MODIFIED_PROPERTY, out text))
				{
					if(Zongsoft.Common.Convert.TryConvertValue(text, out modifiedTimeOffset))
						modifiedTime = modifiedTimeOffset.LocalDateTime;
				}

				if(properties.TryGetValue(StorageHeaders.HTTP_CONTENT_LENGTH_PROPERTY, out text))
					Zongsoft.Common.Convert.TryConvertValue(text, out size);

				if(properties.TryGetValue(StorageHeaders.HTTP_ETAG_PROPERTY, out text))
					checksum = Zongsoft.Common.Convert.FromHexString(text.Trim('"'), '-');

				var info = new Zongsoft.IO.FileInfo(path, size, checksum, createdTime, modifiedTime, _fileSystem.GetUrl(path));

				foreach(var property in properties)
				{
					info.Properties[property.Key] = property.Value;
				}

				return info;
			}
			public override Stream GetStream(HttpContent parent, HttpContentHeaders headers)
			{
				if(parent == null)
					throw new ArgumentNullException("parent");

				if(headers == null)
					throw new ArgumentNullException("headers");

				if(headers.ContentDisposition == null || string.IsNullOrEmpty(headers.ContentDisposition.FileName))
				{
					_isFormData.Add(true);
					return new MemoryStream();
				}

				var contentType = headers.ContentType == null ? string.Empty : headers.ContentType.MediaType;

				if(string.IsNullOrWhiteSpace(contentType))
					contentType = System.Web.MimeMapping.GetMimeMapping(headers.ContentDisposition.FileName);

				_isFormData.Add(false);

				string fileName = null;
				var dispositionName = this.UnquoteToken(headers.ContentDisposition.Name);

				if(!string.IsNullOrWhiteSpace(dispositionName))
				{
					if(_headers.TryGetValue(dispositionName + ".name", out fileName))
						fileName = Zongsoft.Text.TemplateEvaluatorManager.Default.Evaluate<string>(fileName, null).ToLowerInvariant() + System.IO.Path.GetExtension(headers.ContentDisposition.FileName.Trim('"'));
				}

				if(string.IsNullOrWhiteSpace(fileName))
					fileName = string.Format("{0:yyyyMMdd-HHmmss}-{1}{2}", DateTime.Now, (uint)Zongsoft.Common.RandomGenerator.GenerateInt32(), System.IO.Path.GetExtension(headers.ContentDisposition.FileName.Trim('"')));

				var filePath = Zongsoft.IO.Path.Combine(_directoryPath, fileName);

				Zongsoft.IO.FileInfo fileInfo = new Zongsoft.IO.FileInfo(filePath, (headers.ContentDisposition.Size.HasValue ? headers.ContentDisposition.Size.Value : -1), DateTime.Now, null, FileSystem.GetUrl(filePath));
				fileInfo.Properties.Add("FileName", Uri.UnescapeDataString(headers.ContentDisposition.FileName.Trim('"')));

				if(_headers != null && _headers.Count > 0 && !string.IsNullOrWhiteSpace(dispositionName))
				{
					//从全局头里面查找当前上传文件的自定义属性
					foreach(var header in _headers)
					{
						if(header.Key.Length > dispositionName.Length + 1 && header.Key.StartsWith(dispositionName + "-", StringComparison.OrdinalIgnoreCase))
							fileInfo.Properties.Add(header.Key.Substring(dispositionName.Length + 1), header.Value);
					}
				}

				var infoKey = string.IsNullOrWhiteSpace(dispositionName) ? fileName : dispositionName;

				//将文件信息对象加入到集合中
				_fileData.Add(infoKey, fileInfo);

				try
				{
					return FileSystem.File.Open(filePath, FileMode.CreateNew, FileAccess.Write, (fileInfo.HasProperties ? fileInfo.Properties : null));
				}
				catch
				{
					if(fileInfo != null)
						_fileData.Remove(infoKey);

					throw;
				}
			}