/// <summary> /// 当文件上传完成时调用此方法。 /// </summary> public abstract void UploadFinished(UploadFinishedEventArgs e);
private string DoCommand(Microsoft.AspNetCore.Http.HttpContext context) #endif { var request = context.Request; var response = context.Response; switch (this.GetUrlParameter(request, "cmd")) { case "fastupload": //尝试秒传指定的文件。 { string clientFileName = this.GetUrlParameter(request, "filename"); //客户端文件名。 long fileSize = long.Parse(this.GetUrlParameter(request, "filesize")); //文件大小。 string sCheckCode = this.GetUrlParameter(request, "checkcode"); //文件完整性校验码,如果设置了此项参数,则在文件上传完成时执行文件完整性校验。 byte[] clientCheckCode = Thinksea.General.HexString2Bytes(sCheckCode); string customParameter = this.GetUrlParameter(request, "param"); //用户自定义参数。 FastUploadEventArgs e = new FastUploadEventArgs(clientFileName, clientCheckCode, customParameter); this.FastUpload(e); string JSON = System.Text.Json.JsonSerializer.Serialize(new Thinksea.Net.FileUploader.Result() { ErrorCode = 0, Data = e.ResultData,//将需要返回到客户端的数据写回客户端。 }); return(JSON); } case "getoffset": //客户端获取断点续传起始位置。 { string clientFileName = this.GetUrlParameter(request, "filename"); //客户端文件名。 long fileSize = long.Parse(this.GetUrlParameter(request, "filesize")); //文件大小。 string sCheckCode = this.GetUrlParameter(request, "checkcode"); //文件完整性校验码,如果设置了此项参数,则在文件上传完成时执行文件完整性校验。 byte[] clientCheckCode = Thinksea.General.HexString2Bytes(sCheckCode); string customParameter = this.GetUrlParameter(request, "param"); //用户自定义参数。 string tempFile = this.GetTempFile(clientCheckCode); //上传临时存盘文件名。 long p = this.GetContinueUploadPosition(tempFile); string JSON = System.Text.Json.JsonSerializer.Serialize(new Thinksea.Net.FileUploader.Result() { ErrorCode = 0, Data = p, }); //response.Write(p); //_httpContext.Response.Clear(); //_httpContext.Response.End(); return(JSON); } default: //上传文件内容。 { #region 解析查询参数。 string clientFileName = this.GetUrlParameter(request, "filename"); //客户端文件名。 string sFileSize = this.GetUrlParameter(request, "filesize"); //文件大小。 long fileSize = string.IsNullOrEmpty(sFileSize) ? 0 : long.Parse(sFileSize); string sCheckCode = this.GetUrlParameter(request, "checkcode"); //文件完整性校验码,如果设置了此项参数,则在文件上传完成时执行文件完整性校验。 byte[] clientCheckCode = string.IsNullOrEmpty(sCheckCode) ? null : Thinksea.General.HexString2Bytes(sCheckCode); string customParameter = this.GetUrlParameter(request, "param"); //用户自定义参数。 string sOffset = this.GetUrlParameter(request, "offset"); //上传数据起始偏移地址。 long startByte = string.IsNullOrEmpty(sOffset) ? 0 : long.Parse(sOffset); #endregion #if NETFRAMEWORK var uploadFiles = request.Files; #elif NETCOREAPP if (!request.HasFormContentType) { return(System.Text.Json.JsonSerializer.Serialize(new Thinksea.Net.FileUploader.Result() { ErrorCode = 1, Message = "未上传文件内容。" })); } var uploadFiles = request.Form.Files; #endif if (uploadFiles.Count > 0) //如果采用标准的网页表单格式上传文件数据。 { var httpPostedFile = uploadFiles[0]; if (string.IsNullOrEmpty(clientFileName)) { clientFileName = httpPostedFile.FileName; } if (string.IsNullOrEmpty(sFileSize)) { #if NETFRAMEWORK fileSize = httpPostedFile.ContentLength; #elif NETCOREAPP fileSize = httpPostedFile.Length; #endif } } else { return(System.Text.Json.JsonSerializer.Serialize(new Thinksea.Net.FileUploader.Result() { ErrorCode = 1, Message = "未上传文件内容。" })); } string tempFile = this.GetTempFile(clientCheckCode); //上传临时存盘文件名。 this.BeginUpload(new FileUploadEventArgs(tempFile, clientFileName, customParameter, startByte)); //如果是第一次上传数据则删除同名文件。 if (startByte == 0) { #if DEBUG System.Diagnostics.Debug.WriteLine("准备写入第一个数据块。"); #endif //删除临时文件。 if (System.IO.File.Exists(tempFile)) { System.IO.File.Delete(tempFile); } } #if DEBUG System.Diagnostics.Debug.WriteLine(string.Format("写数据到磁盘目录: {0}", this.FileUploadTempDirectory)); #endif bool updateFinish = false; byte[] serverCheckCode = null; long writeDataSize = 0; System.IO.FileStream outputStream = System.IO.File.Open(tempFile, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite, System.IO.FileShare.None); //System.IO.IOException try { outputStream.Position = startByte; #if NETFRAMEWORK System.IO.Stream inputStream; if (uploadFiles.Count > 0) //如果采用标准的网页表单格式上传文件数据。 { var httpPostedFile = uploadFiles[0]; inputStream = httpPostedFile.InputStream; } else //如果非表单(即所有POST发送的内容原文既是文件数据) { inputStream = request.InputStream; } writeDataSize = this.SaveFile(inputStream, outputStream); #elif NETCOREAPP System.IO.Stream inputStream; if (uploadFiles.Count > 0) //如果采用标准的网页表单格式上传文件数据。 { var httpPostedFile = uploadFiles[0]; using (inputStream = httpPostedFile.OpenReadStream()) { writeDataSize = this.SaveFile(inputStream, outputStream); } } else //如果非表单(即所有POST发送的内容原文既是文件数据) { using (inputStream = request.Body) { writeDataSize = this.SaveFile(inputStream, outputStream); } } #endif #if DEBUG System.Diagnostics.Debug.WriteLine("写数据到磁盘成功。"); #endif if (outputStream.Position == fileSize) //如果上传完成。 { #if DEBUG System.Diagnostics.Debug.WriteLine("写入最后一个数据块完成。"); #endif #region 对比文件完整性校验码是否相同。 long p = outputStream.Position; try { outputStream.Position = 0; serverCheckCode = this.GetCheckCode(outputStream); } finally { outputStream.Position = p; } if (clientCheckCode != null && !Thinksea.General.CompareArray(clientCheckCode, serverCheckCode)) { outputStream.Close(); outputStream.Dispose(); outputStream = null; if (System.IO.File.Exists(tempFile)) { System.IO.File.Delete(tempFile); } throw new System.Exception("上传失败,未通过最后的文件校验过程。"); } #endregion updateFinish = true; } else { updateFinish = false; } } finally { if (outputStream != null) { outputStream.Close(); outputStream.Dispose(); outputStream = null; } } string JSON; if (updateFinish) { UploadFinishedEventArgs finishedFileUploadEventArgs = new UploadFinishedEventArgs(tempFile, clientFileName, serverCheckCode, customParameter); this.UploadFinished(finishedFileUploadEventArgs); //string targetFile = this.GetTargetFile(finishedFileUploadEventArgs.ClientFileName); //if (finishedFileUploadEventArgs.ServerFile != targetFile) //{ // if (System.IO.File.Exists(targetFile)) // { // System.IO.File.Delete(targetFile); // } // System.IO.File.Move(finishedFileUploadEventArgs.ServerFile, targetFile);//将临时文件名更改为目的文件名。 //} //return finishedFileUploadEventArgs.ResultData; JSON = System.Text.Json.JsonSerializer.Serialize(new Thinksea.Net.FileUploader.Result() { ErrorCode = 0, Data = finishedFileUploadEventArgs.ResultData,//将需要返回到客户端的数据写回客户端。 }); } else { JSON = System.Text.Json.JsonSerializer.Serialize(new Thinksea.Net.FileUploader.Result() { ErrorCode = 0, }); } return(JSON); } } }