2010-06-18 2 views
15

HttpWebRequest와 함께 파일을 보내는 중입니다. 내 파일은 FileUpload UI에서 가져옵니다. 여기에 파일 업로드를 HttpWebRequest와 함께 스트림을 보내려면 파일 스트림으로 변환해야합니다. FileUpload를 파일 스트림으로 변환하려면 어떻게해야합니까?FileUpload to FileStream

+1

필요하지 않은 경우 당신이 실제로 무엇을하려고를는 FileUpload 파일을 넣을 수 있습니다 달성하기 위해? –

+1

한 도메인에서 다른 도메인으로 파일을 전송해야합니다. 그래서 업로드 된 파일을 가져 와서 HttpWebRequest를 사용하여 보내십시오. –

답변

20

는 I 바이트 어레이로 변환하도록 다음 코드를 사용

public static byte[] ReadFully(Stream input) 
{ 
    byte[] buffer = new byte[input.Length]; 
    //byte[] buffer = new byte[16 * 1024]; 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     int read; 
     while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      ms.Write(buffer, 0, read); 
     } 
     return ms.ToArray(); 
    } 
} 
+0

PostedFile은 .InputStream .. 감사합니다. – lawphotog

3

FileUpload를 FileStream으로 변환 할 수 없습니다. 그러나 FileUpload의 PostedFile 속성에서 MemoryStream을 가져올 수 있습니다. 그런 다음 MemoryStream을 사용하여 HttpWebRequest를 채울 수 있습니다. FileUpload.PostedFile.InputStream 나 스트리밍 제공하기 때문에

+2

코드 예제 나 링크로 자세히 설명해 주시겠습니까? – PeterX

+0

@PeterX : 예를 들어 Extremeswank의 답변을 참조하십시오. – ErikHeemskerk

11

출력 스트림에 직접 입력 스트림 파이프 나은 결과 :

inputStream.CopyTo(outputStream); 

이렇게하면 다시 전송하기 전에 전체 파일을 메모리에 캐싱하지 않습니다.

FileUpload fu; // Get the FileUpload object for the current connection here. 
HttpWebRequest hr; // Set up your outgoing connection here. 
using (Stream s = hr.GetRequestStream()) 
{ 
    fu.PostedFile.InputStream.CopyTo(s); 
    s.Flush(); 
} 

하는 것이 더 될 것이라고 : 다른 웹 요청에 직접 쓰고 싶다 경우

FileUpload fu; // Get the FileUpload object. 
using (FileStream fs = File.OpenWrite("file.dat")) 
{ 
    fu.PostedFile.InputStream.CopyTo(fs); 
    fs.Flush(); 
} 

, 당신은 다음 작업을 수행 할 수 있습니다 : 예를 들어, 여기 당신이하여 FileStream에 기록 할 방법입니다 메모리 또는 디스크에 처음 캐싱하지 않고도 입력 호스트에 직접 입력 파일을 스트리밍 할 수 있으므로 효율적입니다.

+0

PostedFile에 액세스하면 파일이 ASP.NET에 의해 완전히 버퍼링됩니다. 이것은'HttpRequest.GetBufferlessInputStream()'(.NET 4 또는 그 이상)을 사용해서 만 회피 할 수 있지만, 차례로 요청 몸 전체를 파싱해야합니다. – ErikHeemskerk

1

당신은 FileBytes (기술 저크에서 간단하게 답)

using (MemoryStream ms = new MemoryStream(FileUpload1.FileBytes)) 
{ 
    //do stuff 
} 

또는를 사용하여 MemoryStream에 직접 당신이 MemoryStream을

byte[] bin = FileUpload1.FileBytes;