2012-09-05 58 views
0

我需要將一個函數添加到以C#編寫的現有CGI應用程序中作爲Windows控制檯應用程序。我需要添加一些用戶能夠提交數據文件進行處理的功能。數據文件可以是text/csv文件或各種二進制文件(.xls,.pdf)。我有一個使用字段選擇/提交文件的簡單測試HTML表單。這一切都很好。我可以將文本文件保存在服務器上,而不會出現問題。但是,如何保存二進制文件?我相信這很容易做到,但我一直無法弄清楚。如何保存通過HTML表單域提交的二進制文件?

下面是一些示例代碼,保存文本文件的工作原理:

String formData = Console.In.ReadToEnd(); 
string boundary = string.Empty; 
string[] cPairs = cType.Split(new string[] { "; " }, StringSplitOptions.None); 
foreach (string pair in cPairs) { 
    //finds the 'boundary' text 
    if (pair.Contains("boundary")) 
     boundary = "--" + pair.Split('=')[1]; 
} 

//splits on the 'boundary' to get individual form fields/sections 
string[] sections = rawParams.Split(new string[] { boundary }, StringSplitOptions.RemoveEmptyEntries); 

// parse each section 
foreach (string section in sections) { 
    string[] parts = section.Split(new string[] { "; ", Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); 
    if (parts[1].Equals("name=\"dFile\"")) { // 'dFile' is the form field-name for the datafile 
     //below lines get the filename 
     Regex regx = new Regex("filename=\"(.+)\"", RegexOptions.IgnoreCase); 
     Match fPath = regx.Match(parts[2]); 
     FileInfo fi = new FileInfo(fPath.Groups[1].Value); 
     regx = new Regex("([-A-Z0-9_ .]+)", RegexOptions.IgnoreCase); 
     Match fname = regx.Match(fi.Name); 

     //below lines save the file contents to a text file; starts at index 4 of the 'parts' array 
     if (fname.Groups[1].Success) { 
      TextWriter tw = new StreamWriter(fname.Groups[1].Value); 
      for (int i = 4; i < parts.Length; i++) { 
       tw.WriteLine(parts[i]); 
      } 
      tw.Close(); 
     } 
    } 
    else { 
     // parse other non-file form fields 
    } 
} 

的關鍵部分是保存到文件中。我將如何做一個二進制文件?使用正確的編碼

FileStream fs = File.Create(fname.Groups[1].Value, SOME_SIZE, FileOptions.None)) 
BinaryFormatter formatter = new BinaryFormatter(); 
... 
//inside your loop 
string s = parts[i]; 
formatter.Serialize(fs, Encoding.Unicode.GetBytes(s)); 

顯然GetBytes(): 戴夫

+0

CGI應用程序?你有什麼代碼? –

+0

@DaveKub你有什麼代碼?,C#Web或Win App ... – Elyor

+0

我已經添加了一些示例代碼的問題。該應用程序被編寫爲控制檯應用程序。 – DaveKub

回答

0

如果你只是看一些數據轉儲到一個二進制文件,使用類似。

所以,你的代碼應該是這樣的:

String formData = Console.In.ReadToEnd(); 
string boundary = string.Empty; 
string[] cPairs = cType.Split(new string[] { "; " }, StringSplitOptions.None); 
foreach (string pair in cPairs) { 
//finds the 'boundary' text 
if (pair.Contains("boundary")) 
    boundary = "--" + pair.Split('=')[1]; 
} 

//splits on the 'boundary' to get individual form fields/sections 
string[] sections = rawParams.Split(new string[] { boundary }, StringSplitOptions.RemoveEmptyEntries); 

// parse each section 
foreach (string section in sections) { 
string[] parts = section.Split(new string[] { "; ", Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); 
if (parts[1].Equals("name=\"dFile\"")) { // 'dFile' is the form field-name for the datafile 
    //below lines get the filename 
    Regex regx = new Regex("filename=\"(.+)\"", RegexOptions.IgnoreCase); 
    Match fPath = regx.Match(parts[2]); 
    FileInfo fi = new FileInfo(fPath.Groups[1].Value); 
    regx = new Regex("([-A-Z0-9_ .]+)", RegexOptions.IgnoreCase); 
    Match fname = regx.Match(fi.Name); 

    FileStream fs = File.Create(fname.Groups[1].Value, SOME_SIZE, FileOptions.None)) 
    BinaryFormatter formatter = new BinaryFormatter(); 

    //below lines save the file contents to a text file; starts at index 4 of the 'parts' array 
    if (fname.Groups[1].Success) { 
     for (int i = 4; i < parts.Length; i++) { 
      string s = parts[i]; 
      formatter.Serialize(fs, Encoding.Unicode.GetBytes(s)); 
     } 
    } 
} 
else { 
    // parse other non-file form fields 
} 

}在C#

+0

嘗試了該代碼並創建了一個二進制文件,但它與原始文件不匹配。我不知道'正確的'編碼是什麼,所以我編寫了一個遍歷所有'Encoding.GetEncodings()'的循環,並且它們都沒有生成與原始文件匹配的文件。 – DaveKub

+0

試過BinaryWriter而不是BinaryFormatter? –

+0

剛剛嘗試過BinaryWriter;與BinaryFormatter相同的結果。我正在測試一個包含單個文本文件的zip文件。大部分編碼都會創建一個WinZip根本無法打開的文件;其他人創建一個WinZip可以打開並顯示內容但不能提取的文件。 – DaveKub