/// <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; })); }
/// <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); }
/// <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; }
/// <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; }); }