Пример #1
0
        /// <summary>
        /// 新增一个文件或多个文件。
        /// </summary>
        /// <param name="id">指定新增文件所属的容器编号。</param>
        /// <returns>返回新增文件的<see cref="Models.StorageFile"/>描述信息实体对象集。</returns>
        public async Task <ICollection <StorageFileInfo> > Post(int id)
        {
            if (id < 1)
            {
                throw new ArgumentOutOfRangeException("id(BucketId)");
            }

            //检测请求的内容是否为Multipart类型
            if (!this.Request.Content.IsMimeMultipartContent("form-data"))
            {
                throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
            }

            var bucketInfo = this.Bucket.GetInfo(id);

            if (bucketInfo == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }

            //创建多段表单信息的文件流操作的供应程序
            var provider = new MultipartStorageFileStreamProvider(id, ResolveBucketPath(bucketInfo.Path, DateTime.Now));

            //从当前请求内容读取多段信息并写入文件中
            return(await this.Request.Content.ReadAsMultipartAsync(provider).ContinueWith(t =>
            {
                var pro = t.Result;

                foreach (var fileInfo in pro.FileData)
                {
                    if (pro.FormData.Count > 0)
                    {
                        for (int i = 0; i < pro.FormData.Count; i++)
                        {
                            fileInfo.ExtendedProperties.Add(pro.FormData.GetKey(i), pro.FormData[i]);
                        }
                    }

                    this.File.Create(fileInfo, null);
                }

                //返回新增的文件信息实体集
                return pro.FileData;
            }));
        }
Пример #2
0
        /// <summary>
        /// 将网络请求中的一个文件或多个文件写入到指定的目录中。
        /// </summary>
        /// <param name="request">网络请求消息。</param>
        /// <param name="directory">指定文件写入的目录路径(绝对路径以“/”斜杠符打头);如果为空(null)或全空字符串,则写入目录为<see cref="BasePath"/>属性指定的路径。</param>
        /// <param name="onWriting">当文件写入前激发的通知回调。</param>
        /// <returns>返回写入成功的<see cref="Zongsoft.IO.FileInfo"/>文件描述信息实体对象集。</returns>
        public async Task <IEnumerable <Zongsoft.IO.FileInfo> > Write(HttpRequestMessage request, string directory = null, Action <WritingEventArgs> onWriting = null)
        {
            var filePath = this.GetFilePath(directory);

            //检测请求的内容是否为Multipart类型
            if (!request.Content.IsMimeMultipartContent("form-data"))
            {
                throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
            }

            //创建自定义头的字典
            var headers = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase);

            //构建自定义头的字典内容
            foreach (var header in request.Headers)
            {
                if (header.Key.Length > EXTENDED_PROPERTY_PREFIX.Length && header.Key.StartsWith(EXTENDED_PROPERTY_PREFIX, StringComparison.OrdinalIgnoreCase))
                {
                    headers[header.Key.Substring(EXTENDED_PROPERTY_PREFIX.Length)] = Uri.UnescapeDataString(string.Join("", header.Value));
                }
            }

            //创建多段表单信息的文件流操作的供应程序
            var provider = new MultipartStorageFileStreamProvider(filePath, headers, onWriting);

            //从当前请求内容读取多段信息并写入文件中
            var result = await request.Content.ReadAsMultipartAsync(provider);

            if (result.FormData != null && result.FormData.Count > 0)
            {
                foreach (var fileInfo in result.FileData)
                {
                    object dispositionName;
                    string prefix;

                    if (fileInfo.HasProperties && fileInfo.Properties.TryGetValue(EXTENDED_PROPERTY_DISPOSITIONNAME, out dispositionName))
                    {
                        prefix = (string)dispositionName + ":";
                    }
                    else
                    {
                        continue;
                    }

                    var updateRequires = false;

                    foreach (var formEntry in result.FormData)
                    {
                        if (formEntry.Key.Length > prefix.Length && formEntry.Key.StartsWith(prefix, StringComparison.OrdinalIgnoreCase))
                        {
                            updateRequires = true;
                            fileInfo.Properties[formEntry.Key.Substring(prefix.Length)] = formEntry.Value;
                        }
                    }

                    if (updateRequires)
                    {
                        await FileSystem.File.SetInfoAsync(fileInfo.Path.Url, fileInfo.Properties);
                    }
                }
            }

            //返回新增的文件信息实体集
            return(result.FileData);
        }
Пример #3
0
		/// <summary>
		/// 新增一个文件或多个文件。
		/// </summary>
		/// <param name="path">指定新增文件的目录路径(绝对路径以/斜杠打头)。</param>
		/// <returns>返回新增文件的<see cref="Zongsoft.IO.FileInfo"/>描述信息实体对象集。</returns>
		public async Task<IEnumerable<Zongsoft.IO.FileInfo>> Post(string path = null)
		{
			var directoryPath = this.GetFilePath(path);

			//检测请求的内容是否为Multipart类型
			if(!this.Request.Content.IsMimeMultipartContent("form-data"))
				throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);

			//创建自定义头的字典
			var headers = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);

			//构建自定义头的字典内容
			foreach(var header in this.Request.Headers)
			{
				if(header.Key.Length > EXTENDED_PROPERTY_PREFIX.Length && header.Key.StartsWith(EXTENDED_PROPERTY_PREFIX, StringComparison.OrdinalIgnoreCase))
					headers[header.Key.Substring(EXTENDED_PROPERTY_PREFIX.Length)] = string.Join("", header.Value);
			}

			//创建多段表单信息的文件流操作的供应程序
			var provider = new MultipartStorageFileStreamProvider(directoryPath, headers);

			//从当前请求内容读取多段信息并写入文件中
			var result = await this.Request.Content.ReadAsMultipartAsync(provider);

			if(result.FormData != null && result.FormData.Count > 0)
			{
				foreach(var fileEntry in result.FileData)
				{
					var prefix = EXTENDED_PROPERTY_PREFIX + fileEntry.Key + "-";
					var updateRequires = false;

					foreach(var formEntry in result.FormData)
					{
						if(formEntry.Key.Length > prefix.Length && formEntry.Key.StartsWith(prefix, StringComparison.OrdinalIgnoreCase))
						{
							updateRequires = true;
							fileEntry.Value.Properties[formEntry.Key.Substring(prefix.Length)] = formEntry.Value;
						}
					}

					if(updateRequires)
						await FileSystem.File.SetInfoAsync(fileEntry.Value.Path.Url, fileEntry.Value.Properties);
				}
			}

			//返回新增的文件信息实体集
			return result.FileData.Values;
		}
Пример #4
0
		/// <summary>
		/// 新增一个文件或多个文件。
		/// </summary>
		/// <param name="id">指定新增文件所属的容器编号。</param>
		/// <returns>返回新增文件的<see cref="Models.StorageFile"/>描述信息实体对象集。</returns>
		public async Task<ICollection<StorageFileInfo>> Post(int id)
		{
			if(id < 1)
				throw new ArgumentOutOfRangeException("id(BucketId)");

			//检测请求的内容是否为Multipart类型
			if(!this.Request.Content.IsMimeMultipartContent("form-data"))
				throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);

			var bucketInfo = this.Bucket.GetInfo(id);

			if(bucketInfo == null)
				throw new HttpResponseException(HttpStatusCode.NotFound);

			//创建多段表单信息的文件流操作的供应程序
			var provider = new MultipartStorageFileStreamProvider(id, ResolveBucketPath(bucketInfo.Path, DateTime.Now));

			//从当前请求内容读取多段信息并写入文件中
			return await this.Request.Content.ReadAsMultipartAsync(provider).ContinueWith(t =>
			{
				var pro = t.Result;

				foreach(var fileInfo in pro.FileData)
				{
					if(pro.FormData.Count > 0)
					{
						for(int i = 0; i < pro.FormData.Count; i++ )
							fileInfo.ExtendedProperties.Add(pro.FormData.GetKey(i), pro.FormData[i]);
					}

					this.File.Create(fileInfo, null);
				}

				//返回新增的文件信息实体集
				return pro.FileData;
			});
		}