0

아래 코드를 사용하여 웹 사이트에 파일을 인증하고 업로드하는 데이 코드를 사용하고 있지만 "부패한 양식 데이터 : 선행 경계 없음"오류가 발생합니다. 나는이를 볼 수있는 피들러에서 C# 업로드 파일 오류 - 손상된 양식 데이터 : 선행 경계 없음

는, (내가 브라우저을 사용하여 파일을 업로드 할 때 나는 동일한 일을 참조)하지 내가 사용하고있는 중이 야 때 오류가 점점 오전 확실한 이유 C#을 HttpWebRequest/웹 클라이언트

피들러 정보 :

------WebKitFormBoundary9ewWOMyBmk0YAhTL 
Content-Disposition: form-data; name="FileSubmitted"; filename="SAMPLE_0001.xls" 
Content-Type: application/vnd.ms-excel 

------WebKitFormBoundary9ewWOMyBmk0YAhTL 
Content-Disposition: form-data; name="FileSubmittedValue" 

C:\path\SAMPLE_0001.xls 
------WebKitFormBoundary9ewWOMyBmk0YAhTL-- 

가정 :

'경계'값으로 로그인 한 후 '경계'값을 얻는 방법을 모르므로 값이 하드 코딩되었습니다.

코드 : 유래에서 복사

static void Main() 
{ 
    NameValueCollection nvCollection = new NameValueCollection(); 
    CookieAwareWebClient webClient = new CookieAwareWebClient(); 

    nvCollection.Clear(); 
    nvCollection["Name"] = "ABC"; 
    nvCollection["Password"] = "XYZ"; 
    //Login to the Site 
    byte[] responseBytes = webClient.UploadValues("https://www.somesite.com/login.cfm", "POST", nvCollection); 
    string resultAuthTicket = Encoding.UTF8.GetString(responseBytes); 
    //Get Cookies 
    CookieCollection cookies = webClient.CookieContainer.GetCookies(new Uri("https://www.somesite.com/login.cfm")); 
    // 
    string URL = "https://www.somesite.com/app/request.cfm"; 
    string boundary = "----WebKitFormBoundary9ewWOMyBmk0YAhTL"; 
    string FilePath = "C:\\Users\\user.name\\Desktop\\SAMPLE_0001.xls"; 
    byte[] fileData = GetMultipartFormData(new Dictionary<string, object>() { { "FileSubmitted", FilePath } }, boundary); 
    PostForm(URL, "", "", fileData, boundary, cookies); 
} 
private static byte[] GetMultipartFormData(Dictionary<string, object> postParameters, string boundary) 
{ 
    Encoding encoding = Encoding.UTF8; 
    Stream formDataStream = new System.IO.MemoryStream(); 
    bool needsCLRF = false; 
    foreach (var param in postParameters) 
    { 
     // Thanks to feedback from commenters, add a CRLF to allow multiple parameters to be added. 
     // Skip it on the first parameter, add it to subsequent parameters. 
     if (needsCLRF) 
      formDataStream.Write(encoding.GetBytes("\r\n"), 0, encoding.GetByteCount("\r\n")); 
     needsCLRF = true; 
     { 
      string postData = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\"\r\nContent-Type: {3}\r\n\r\n", 
       boundary, 
       param.Key, 
       param.Value, 
       "application/vnd.ms-excel"); 
      formDataStream.Write(encoding.GetBytes(postData), 0, encoding.GetByteCount(postData)); 
      string postData2 = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\" \r\n\r\n{2}", 
       boundary, 
       "FileSubmittedValue", 
       "C:\\path\\SAMPLE_0001.xls"); 
      formDataStream.Write(encoding.GetBytes(postData2), 0, encoding.GetByteCount(postData2)); 
     } 
    } 
    // Add the end of the request. Start with a newline 
    string footer = "\r\n--" + boundary + "--\r\n"; 
    formDataStream.Write(encoding.GetBytes(footer), 0, encoding.GetByteCount(footer)); 
    // Dump the Stream into a byte[] 
    formDataStream.Position = 0; 
    byte[] formData = new byte[formDataStream.Length]; 
    formDataStream.Read(formData, 0, formData.Length); 
    formDataStream.Close(); 
    return formData; 
} 
private static HttpWebResponse PostForm(string postUrl, string userAgent, string contentType, byte[] formData, string boundary, CookieCollection cookies) 
{ 
    HttpWebRequest request = WebRequest.Create(postUrl) as HttpWebRequest; 
    if (request == null) 
    { 
     throw new NullReferenceException("request is not a http request"); 
    } 
    // Set up the request properties. 
    request.UserAgent = userAgent; 
    request.ContentLength = formData.Length; 
    request.ContentType = "multipart/form-data; boundary=" + boundary; 
    request.Method = "POST"; 
    request.KeepAlive = true; 
    request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"; 
    request.CookieContainer = new CookieContainer(); 
    request.CookieContainer.Add(cookies); 
    request.Host = "secure.somesite.com"; 
    request.Referer = String.Format("https://secure.somesite.com/app/request.cfm?CFID={0}&CFTOKEN={1}", cookies[0].Value, cookies[1].Value); 
    request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36"; 
    // Send the form data to the request. 
    using (Stream requestStream = request.GetRequestStream()) 
    { 
     requestStream.Write(formData, 0, formData.Length); 
     requestStream.Close(); 
    } 
    try 
    { 
     return request.GetResponse() as HttpWebResponse; 
    } 
    catch (WebException wex) 
    { 
     var pageContent = new StreamReader(wex.Response.GetResponseStream()) 
           .ReadToEnd(); 
     return null; 
    } 
    return null;  
} 

오류 :

<head><title>JRun Servlet Error</title></head><h1>500 </h1><body> 
<pre> 
Corrupt form data: no leading boundary: != ------WebKitFormBoundary9ewWOMyBmk0YAhTL</pre><br><pre> 
java.io.IOException: Corrupt form data: no leading boundary: != ------WebKitFormBoundary9ewWOMyBmk0YAhTL 
    at com.oreilly.servlet.multipart.MultipartParser.&lt;init&gt;(MultipartParser.java:176) 
    at com.oreilly.servlet.multipart.MultipartParser.&lt;init&gt;(MultipartParser.java:95) 
    at coldfusion.filter.FormScope.fillMultipart(FormScope.java:170) 
    at coldfusion.filter.FusionContext.SymTab_initForRequest(FusionContext.java:435) 
    at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:33) 
    at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22) 
    at coldfusion.filter.RequestThrottleFilter.invoke(RequestThrottleFilter.java:126) 
    at coldfusion.CfmServlet.service(CfmServlet.java:175) 
    at coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89) 
    at jrun.servlet.FilterChain.doFilter(FilterChain.java:86) 
    at coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42) 
    at coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46) 
    at jrun.servlet.FilterChain.doFilter(FilterChain.java:94) 
    at jrun.servlet.FilterChain.service(FilterChain.java:101) 
    at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106) 
    at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42) 
    at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286) 
    at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543) 
    at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203) 
    at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428) 
    at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66) 
</pre></body> 

이 알고하지 마십시오 : I에 유래에서이 소스 코드를 복사 때문에, 나는 돈 ' 파일이 실제로 서버의 C : \ Path 폴더에 업로드되고 있는지 확인합니다 (Fiddler 데이터보기).

업데이트 : 나는 브라우저를 사용하여 파일을 업로드 할 때 내가 콘텐츠 길이 참조 : 49,504를,하지만 난 C# 프로그램을 콘텐츠 길이를 사용하려고하면 385 (심지어 나는 모두 같은 파일을 사용할 때 브라우저 및 C# 프로그램) 또한

, 내가 얻고 지금하려고 할 때 "어떤 데이터가 업로드 된 파일 SAMPLE_0001.xls 수신되지 않았다"

답변

0

코드는 실제입니다 코드 줄을 누락 파일 내용.

formDataStream.Write(fileToUpload.File, 0, fileToUpload.File.Length); 

귀하의 도움에 감사드립니다!

관련 문제