/// <summary> /// /// </summary> /// <param name="filename"></param> /// <param name="contentType"></param> /// <param name="stream"></param> /// <returns></returns> public static HttpFormFile NewFileFromStream(string filename, string contentType, Stream stream) { HttpFormFile obj = newObject(filename, contentType, stream); obj.BodyType = HttpFileType.FILE_STREAM; return(obj); }
/// <summary> /// /// </summary> /// <param name="filename"></param> /// <param name="contentType"></param> /// <param name="fileData"></param> /// <returns></returns> public static HttpFormFile NewFileFromBytes(string filename, string contentType, byte[] fileData) { HttpFormFile obj = newObject(filename, contentType, fileData); obj.BodyType = HttpFileType.DATA_BYTES; return(obj); }
/// <summary> /// /// </summary> /// <param name="filename"></param> /// <param name="contentType"></param> /// <param name="filepath"></param> /// <returns></returns> public static HttpFormFile NewFileFromPath(string filename, string contentType, string filepath) { HttpFormFile obj = newObject(filename, contentType, filepath); obj.BodyType = HttpFileType.FILE_PATH; return(obj); }
/// <summary> /// /// </summary> /// <param name="filename"></param> /// <param name="contentType"></param> /// <param name="fileData"></param> /// <param name="offset"></param> /// <param name="count"></param> /// <returns></returns> public static HttpFormFile NewFileFromSlice(string filename, string contentType, byte[] fileData, int offset, int count) { HttpFormFile obj = newObject(filename, contentType, fileData); obj.BodyType = HttpFileType.DATA_SLICE; obj.Offset = offset; obj.Count = count; return(obj); }
private static HttpFormFile newObject(string filename, string contentType, object body) { HttpFormFile obj = new HttpFormFile(); obj.Filename = filename; obj.ContentType = contentType; if (body is Stream) { obj.BodyStream = (Stream)body; } else if (body is byte[]) { obj.BodyBytes = (byte[])body; } else if (body is string) { obj.BodyFile = (string)body; } return(obj); }
/// <summary> /// post multi-part data form to remote server /// used to upload file /// </summary> /// <param name="pUrl"></param> /// <param name="pHeaders"></param> /// <param name="pPostParams"></param> /// <param name="httpFormFile"></param> /// <param name="pProgressHandler"></param> /// <param name="pCompletionHandler"></param> public void postMultipartDataRaw(string pUrl, Dictionary<string, string> pHeaders, HttpFormFile pFormFile, ProgressHandler pProgressHandler, RecvDataHandler pRecvDataHandler) { if (pFormFile == null) { if (pRecvDataHandler != null) { pRecvDataHandler(ResponseInfo.fileError(new Exception("no file specified")), null); } return; } HttpWebRequest vWebReq = null; HttpWebResponse vWebResp = null; try { vWebReq = (HttpWebRequest)WebRequest.Create(pUrl); vWebReq.ServicePoint.Expect100Continue = false; } catch (Exception ex) { if (pRecvDataHandler != null) { pRecvDataHandler(ResponseInfo.invalidRequest(ex.Message), null); } return; } try { vWebReq.UserAgent = this.getUserAgent(); vWebReq.AllowAutoRedirect = false; vWebReq.Method = "POST"; //create boundary string formBoundaryStr = this.createFormDataBoundary(); string contentType = string.Format("multipart/form-data; boundary={0}", formBoundaryStr); vWebReq.ContentType = contentType; if (pHeaders != null) { foreach (KeyValuePair<string, string> kvp in pHeaders) { if (!kvp.Key.Equals("Content-Type")) { vWebReq.Headers.Add(kvp.Key, kvp.Value); } } } //write post body vWebReq.AllowWriteStreamBuffering = true; byte[] formBoundaryBytes = Encoding.UTF8.GetBytes(string.Format("{0}{1}\r\n", FORM_BOUNDARY_TAG, formBoundaryStr)); byte[] formBoundaryEndBytes = Encoding.UTF8.GetBytes(string.Format("\r\n{0}{1}{2}\r\n", FORM_BOUNDARY_TAG, formBoundaryStr, FORM_BOUNDARY_TAG)); using (Stream vWebReqStream = vWebReq.GetRequestStream()) { vWebReqStream.Write(formBoundaryBytes, 0, formBoundaryBytes.Length); //write file name string filename = pFormFile.Filename; if (string.IsNullOrEmpty(filename)) { filename = this.createRandomFilename(); } byte[] filePartTitleData = Encoding.UTF8.GetBytes( string.Format("Content-Disposition: form-data; name=\"data\"; filename=\"{0}\"\r\n", filename)); vWebReqStream.Write(filePartTitleData, 0, filePartTitleData.Length); //write content type string mimeType = FORM_MIME_OCTECT; //!!!注意这里 @fengyh 2016-08-17 15:00 if (!string.IsNullOrEmpty(pFormFile.ContentType)) { mimeType = pFormFile.ContentType; } byte[] filePartMimeData = Encoding.UTF8.GetBytes(string.Format("Content-Type: {0}\r\n\r\n", mimeType)); vWebReqStream.Write(filePartMimeData, 0, filePartMimeData.Length); //write file data switch (pFormFile.BodyType) { case HttpFileType.FILE_PATH: try { FileStream fs = File.Open(pFormFile.BodyFile, FileMode.Open, FileAccess.Read); this.writeHttpRequestBody(fs, vWebReqStream); } catch (Exception fex) { if (pRecvDataHandler != null) { pRecvDataHandler(ResponseInfo.fileError(fex), null); } } break; case HttpFileType.FILE_STREAM: this.writeHttpRequestBody(pFormFile.BodyStream, vWebReqStream); break; case HttpFileType.DATA_BYTES: vWebReqStream.Write(pFormFile.BodyBytes, 0, pFormFile.BodyBytes.Length); break; case HttpFileType.DATA_SLICE: vWebReqStream.Write(pFormFile.BodyBytes, pFormFile.Offset, pFormFile.Count); break; } vWebReqStream.Write(formBoundaryEndBytes, 0, formBoundaryEndBytes.Length); vWebReqStream.Flush(); } //fire request vWebResp = (HttpWebResponse)vWebReq.GetResponse(); handleWebResponse(vWebResp, pRecvDataHandler); } catch (Exception exp) { if(pRecvDataHandler!=null) { pRecvDataHandler(ResponseInfo.networkError(exp.Message), null); } } finally { if (vWebResp != null) { vWebResp.Close(); vWebResp = null; } if (vWebReq != null) { vWebReq.Abort(); vWebReq = null; } } }
/// <summary> /// post multi-part data form to remote server /// used to upload file /// </summary> /// <param name="pUrl"></param> /// <param name="pHeaders"></param> /// <param name="pPostParams"></param> /// <param name="httpFormFile"></param> /// <param name="pProgressHandler"></param> /// <param name="pCompletionHandler"></param> public void postMultipartDataForm(string pUrl, Dictionary <string, string> pHeaders, Dictionary <string, string> pPostParams, HttpFormFile pFormFile, ProgressHandler pProgressHandler, CompletionHandler pCompletionHandler) { if (pFormFile == null) { if (pCompletionHandler != null) { pCompletionHandler(ResponseInfo.fileError(new Exception("no file specified")), ""); } return; } HttpWebRequest vWebReq = null; HttpWebResponse vWebResp = null; try { vWebReq = (HttpWebRequest)WebRequest.Create(pUrl); vWebReq.ServicePoint.Expect100Continue = false; } catch (Exception ex) { if (pCompletionHandler != null) { pCompletionHandler(ResponseInfo.invalidRequest(ex.Message), ""); } return; } try { vWebReq.UserAgent = this.getUserAgent(); vWebReq.AllowAutoRedirect = false; vWebReq.Method = "POST"; //create boundary string formBoundaryStr = this.createFormDataBoundary(); string contentType = string.Format("multipart/form-data; boundary={0}", formBoundaryStr); vWebReq.ContentType = contentType; if (pHeaders != null) { foreach (KeyValuePair <string, string> kvp in pHeaders) { if (!kvp.Key.Equals("Content-Type")) { vWebReq.Headers.Add(kvp.Key, kvp.Value); } } } //write post body vWebReq.AllowWriteStreamBuffering = true; byte[] formBoundaryBytes = Encoding.UTF8.GetBytes(string.Format("{0}{1}\r\n", FORM_BOUNDARY_TAG, formBoundaryStr)); byte[] formBoundaryEndBytes = Encoding.UTF8.GetBytes(string.Format("\r\n{0}{1}{2}\r\n", FORM_BOUNDARY_TAG, formBoundaryStr, FORM_BOUNDARY_TAG)); using (Stream vWebReqStream = vWebReq.GetRequestStream()) { //write params if (pPostParams != null) { foreach (KeyValuePair <string, string> kvp in pPostParams) { vWebReqStream.Write(formBoundaryBytes, 0, formBoundaryBytes.Length); byte[] formPartTitleData = Encoding.UTF8.GetBytes( string.Format("Content-Disposition: form-data; name=\"{0}\"\r\n", kvp.Key)); vWebReqStream.Write(formPartTitleData, 0, formPartTitleData.Length); byte[] formPartBodyData = Encoding.UTF8.GetBytes(string.Format("\r\n{0}\r\n", kvp.Value)); vWebReqStream.Write(formPartBodyData, 0, formPartBodyData.Length); } } vWebReqStream.Write(formBoundaryBytes, 0, formBoundaryBytes.Length); //write file name string filename = pFormFile.Filename; if (string.IsNullOrEmpty(filename)) { filename = this.createRandomFilename(); } byte[] filePartTitleData = Encoding.UTF8.GetBytes( string.Format("Content-Disposition: form-data; name=\"file\"; filename=\"{0}\"\r\n", filename)); vWebReqStream.Write(filePartTitleData, 0, filePartTitleData.Length); //write content type string mimeType = FORM_MIME_OCTECT; //!!!注意这里 @fengyh 2016-08-17 15:00 if (!string.IsNullOrEmpty(pFormFile.ContentType)) { mimeType = pFormFile.ContentType; } byte[] filePartMimeData = Encoding.UTF8.GetBytes(string.Format("Content-Type: {0}\r\n\r\n", mimeType)); vWebReqStream.Write(filePartMimeData, 0, filePartMimeData.Length); //write file data switch (pFormFile.BodyType) { case HttpFileType.FILE_PATH: try { FileStream fs = File.Open(pFormFile.BodyFile, FileMode.Open, FileAccess.Read); this.writeHttpRequestBody(fs, vWebReqStream); } catch (Exception fex) { if (pCompletionHandler != null) { pCompletionHandler(ResponseInfo.fileError(fex), ""); } } break; case HttpFileType.FILE_STREAM: this.writeHttpRequestBody(pFormFile.BodyStream, vWebReqStream); break; case HttpFileType.DATA_BYTES: vWebReqStream.Write(pFormFile.BodyBytes, 0, pFormFile.BodyBytes.Length); break; case HttpFileType.DATA_SLICE: vWebReqStream.Write(pFormFile.BodyBytes, pFormFile.Offset, pFormFile.Count); break; } vWebReqStream.Write(formBoundaryEndBytes, 0, formBoundaryEndBytes.Length); vWebReqStream.Flush(); } //fire request vWebResp = (HttpWebResponse)vWebReq.GetResponse(); handleWebResponse(vWebResp, pCompletionHandler); } catch (WebException wexp) { // FIX-HTTP 4xx/5xx Error 2016-11-22, 17:00 @fengyh HttpWebResponse xWebResp = wexp.Response as HttpWebResponse; handleErrorWebResponse(xWebResp, pCompletionHandler, wexp); } catch (Exception exp) { handleErrorWebResponse(vWebResp, pCompletionHandler, exp); } }
private void upload(HttpFormFile fFile, string key, string token, UploadOptions uploadOptions, UpCompletionHandler upCompletionHandler) { string uploadHost = "<UPLOAD_HOST>"; string uploadHostRetry = "<UPLOAD_HOST_RETRY>"; if(Config.UploadFromCDN) { uploadHost = Config.ZONE.UploadHost; uploadHostRetry = Config.ZONE.UpHost; } else { uploadHost = Config.ZONE.UpHost; uploadHostRetry = Config.ZONE.UploadHost; } if (uploadOptions == null) { uploadOptions = UploadOptions.defaultOptions(); } Dictionary<string, string> vPostParams = new Dictionary<string, string>(); //设置key if (!string.IsNullOrEmpty(key)) { vPostParams.Add("key", key); } //设置token vPostParams.Add("token", token); //设置crc32校验 if (uploadOptions.CheckCrc32) { switch (fFile.BodyType) { case HttpFileType.DATA_SLICE: vPostParams.Add("crc32", string.Format("{0}", CRC32.CheckSumSlice(fFile.BodyBytes, fFile.Offset, fFile.Count))); break; case HttpFileType.DATA_BYTES: vPostParams.Add("crc32", string.Format("{0}", CRC32.CheckSumBytes(fFile.BodyBytes))); break; case HttpFileType.FILE_STREAM: long streamLength = fFile.BodyStream.Length; byte[] buffer = new byte[streamLength]; int cnt = fFile.BodyStream.Read(buffer, 0, (int)streamLength); vPostParams.Add("crc32", string.Format("{0}", CRC32.CheckSumSlice(buffer, 0, cnt))); fFile.BodyStream.Seek(0, SeekOrigin.Begin); break; case HttpFileType.FILE_PATH: vPostParams.Add("crc32", string.Format("{0}", CRC32.CheckSumFile(fFile.BodyFile))); break; } } //设置MimeType // FIX: (添加了下一行代码) // 修正上传文件MIME总为octect-stream(原因:未初始化FormFile.ContentType)的问题 // @fengyh 2016-08-17 14:50 fFile.ContentType = uploadOptions.MimeType; //设置扩展参数 foreach (KeyValuePair<string, string> kvp in uploadOptions.ExtraParams) { vPostParams.Add(kvp.Key, kvp.Value); } //设置进度处理和取消信号 ProgressHandler fUpProgressHandler = new ProgressHandler(delegate (long bytesWritten, long totalBytes) { double percent = (double)bytesWritten / totalBytes; //这样做是为了等待回复 if (percent > 0.95) { percent = 0.95; } uploadOptions.ProgressHandler(key, percent); }); CancellationSignal fCancelSignal = new CancellationSignal(delegate () { return uploadOptions.CancellationSignal(); }); // 第一次失败后使用备用域名重试一次 CompletionHandler fUpCompletionHandler = new CompletionHandler(delegate (ResponseInfo respInfo, string response) { Console.WriteLine("form upload result, {0}",respInfo.StatusCode); if (respInfo.needRetry()) // 需要重试 { Console.WriteLine(string.Format("form upload retry")); if (Config.RetryWaitForNext) { Console.WriteLine(string.Format("wait for {0} milisecond(s)", Config.RETRY_INTERVAL_MILISEC)); System.Threading.Thread.Sleep(Config.RETRY_INTERVAL_MILISEC); } if (fFile.BodyStream != null) { fFile.BodyStream.Seek(0, SeekOrigin.Begin); } CompletionHandler retried = new CompletionHandler(delegate (ResponseInfo retryRespInfo, string retryResponse) { Console.WriteLine("form upload retry result, {0}",retryRespInfo.StatusCode); if (respInfo.isOk()) { uploadOptions.ProgressHandler(key, 1.0); } if (fFile.BodyStream != null) { fFile.BodyStream.Close(); } if (upCompletionHandler != null) { try { upCompletionHandler(key, retryRespInfo, retryResponse); } catch (Exception ex) { Console.WriteLine("form upload retry completion error, {0}", ex.Message); } } }); // 使用UPLOAD_HOST_RETRY重试 this.mHttpManager.postMultipartDataForm(uploadHostRetry, null, vPostParams, fFile, fUpProgressHandler, retried); } else // 不需要重试 { if (respInfo.isOk()) { uploadOptions.ProgressHandler(key, 1.0); } if (fFile.BodyStream != null) { fFile.BodyStream.Close(); } if (upCompletionHandler != null) { try { upCompletionHandler(key, respInfo, response); } catch (Exception ex) { Console.WriteLine("form upload completion error, {0}", ex.Message); } } } }); // 使用UPLOAD_HOST上传 this.mHttpManager.postMultipartDataForm(uploadHost, null, vPostParams, fFile, fUpProgressHandler, fUpCompletionHandler); }
private static HttpFormFile newObject(string filename, string contentType, object body) { HttpFormFile obj = new HttpFormFile(); obj.Filename = filename; obj.ContentType = contentType; if (body is Stream) { obj.BodyStream = (Stream)body; } else if (body is byte[]) { obj.BodyBytes = (byte[])body; } else if (body is string) { obj.BodyFile = (string)body; } return obj; }