2013-08-28 7 views
0

현재 프로그램에서 사용중인 원격 서버로 이미지를 보내려고합니다. 내가 해낸 일은 이미지를 먼저 사용자의 워크 스테이션에 저장 한 다음 그 위치를 저장하고 내 방법으로 전달하여 내 서버에 전달하는 것입니다.파일 형식이 지원되지 않습니다.

그러나 코드를 실행하여 이미지를 전달할 때 내 파일 유형이 지원되지 않는다는 오류가 발생합니다.

public static void HttpUploadFile(string url, string file, string paramName, string contentType, NameValueCollection nvc) 
    { 
     Console.Write(string.Format("Uploading {0} to {1}", file, url)); 
     string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x"); 
     byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n"); 

     HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url); 
     wr.ContentType = "multipart/form-data; boundary=" + boundary; 
     wr.Method = "POST"; 
     wr.KeepAlive = true; 
     wr.Credentials = System.Net.CredentialCache.DefaultCredentials; 

     Stream rs = wr.GetRequestStream(); 

     string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}"; 
     foreach (string key in nvc.Keys) 
     { 
      rs.Write(boundarybytes, 0, boundarybytes.Length); 
      string formitem = string.Format(formdataTemplate, key, nvc[key]); 
      byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem); 
      rs.Write(formitembytes, 0, formitembytes.Length); 
     } 
     rs.Write(boundarybytes, 0, boundarybytes.Length); 

     string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n"; 
     string header = string.Format(headerTemplate, paramName, file, contentType); 
     byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header); 
     rs.Write(headerbytes, 0, headerbytes.Length); 

     FileStream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read); 
     byte[] buffer = new byte[4096]; 
     int bytesRead = 0; 
     while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) 
     { 
      rs.Write(buffer, 0, bytesRead); 
     } 
     fileStream.Close(); 

     byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n"); 
     rs.Write(trailer, 0, trailer.Length); 
     rs.Close(); 

     WebResponse wresp = null; 
     try 
     { 
      wresp = wr.GetResponse(); 
      Stream stream2 = wresp.GetResponseStream(); 
      StreamReader reader2 = new StreamReader(stream2); 
      Console.Write(string.Format("File uploaded, server response is: {0}", reader2.ReadToEnd())); 
     } 
     catch (Exception ex) 
     { 
      Console.Write("Error uploading file", ex); 
      if (wresp != null) 
      { 
       wresp.Close(); 
       wresp = null; 
      } 
     } 
     finally 
     { 
      wr = null; 
     } 
    } 

나는 그렇게 같은 방법 전화 해요 : : 여기

내 코드의 아래 실행 위의 방법 SFD에서

NameValueCollection nvc = new NameValueCollection(); 
    nvc.Add("id", "TTR"); 
    nvc.Add("btn-submit-photo", "Upload"); 
HttpUploadFile("http://WebSiteLocation.com/images/uploadimage.html", sfd.ToString(),"image", "image/jpeg", nvc); 

를 내가하는 데 사용하는 저장 파일 대화 상자에 관련 이미지를 저장하십시오. 오류는 다음과 같습니다.

주어진 경로의 형식은 지원되지 않습니다. 이 라인에서 강조

는 :

FileStream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read); 

나는 위의 코드 내가 이런 일이 혼란 스러워요 이유에 따라 어떤 파일을 보내 괜찮을 것이라고 생각했다.

누구나 그 이유를 볼 수 있습니까? 나는 이걸 보면서 잠시 동안 보냈고 나는 눈과 두뇌의 새로운 쌍이 필요하다고 생각한다. 완료를 위해서

내가 sfc.ToString()를 호출 할 때 내가 돌아올 문자열이 있습니다 :

System.Windows.Forms.SaveFileDialog : 제목 : 파일 이름 : C : \ 사용자 \ 내 컴퓨터 바탕 화면 \ IMG \. png

+0

좋은 점. 그것을 변경하고 나는 여전히 동일한 문제와 오류를 가지고 있습니다. 파일은 짝이 될 수 있습니다. 텍스트, 이미지 등 – N0xus

+0

응용 프로그램을 실행하는 사용자는 누구입니까? 권한 문제인지 궁금해? –

+0

그것은 Windows 7 컴퓨터에서 winform 응용 프로그램이고 내 계정에 대한 전체 관리자 권한을가집니다. – N0xus

답변

1

예외 메시지가 파일 형식에 대해 불평하지 않습니다. 그것은 파일 이름의 형식에 대해 불평하고 있습니다. 경로에 유효하지 않은 문자가있을 수 있습니다. 파일을 열기 전에 코드에서

이 쓰기 :

if (file.IndexOfAny(Path.GetInvalidPathChars()) >= 0) 
{ 
    throw new ArgumentException("File name contains invalid characters", "file"); 
} 

을 그 문제를 식별하는 경우, 당신의 가장 좋은 방법은 당신이 메서드를 호출하기 전에 그 문제를 해결하는 것입니다. 어쩌면 문제가되는 문자를 제거하거나 밑줄로 변환 할 수 있습니다. 프로그램이 어떻게 작동하는지 더 많이 알지 못하면 권장 사항을 작성하기가 어렵습니다.

0

해당 문자열 (sfd)에서 파일 이름을 파싱하고 있습니까? 로컬에서 실행하지 않으면 내 첫 번째 추측은 파일 이름에 사용중인 문자열이 좋지 않다는 것입니다. 파일의 경로 여야합니다. 맞습니까?

+0

sfc.ToString() 대신 "C : \ Users \ MyComputer \ Desktop \ Img.png"를 하드 코딩하면 무슨 일이 일어 납니까? – nkirkes

+0

하드 코딩 할 수 없기 때문에 내 저장 시점과 내가해야 할 일을 무효화 할 수 있습니다. 하지만 예, 오류는 저의 저장 문자열과 관련이 있다고 생각합니다. 무엇을 어떻게 고쳐야할지 모릅니다. – N0xus

+0

오류가 발생했습니다. 고맙습니다. – N0xus