curl -F c# 上传文件

curl -F c# upload file

我有一个包含 -F 的 curl 语句。我需要为 cURL -F 做什么?通过将以下内容添加到下面的代码 request.Headers.Add(HttpRequestHeader.Cookie, (header));

,我已经能够通过将它传递到 header 来让 -b 工作

为了将文档文件和 xml 添加到内容变量,我将执行以下操作,但是这不起作用并且会出错。根据供应商规范,您必须在 xml= 和数据之间有一个 space。

byte[] byteData = Bytes.Combine(Bytes.ConvertToBytesUTF8("documentFile="), File.ReadAllBytes(file));
string postData = new StreamReader(file2).ReadToEnd();
postData = string.Format(postData, documentpath,folderid);
byteData = Bytes.Combine(byteData,Bytes.ConvertToBytesUTF8("xml= "));
byteData = Bytes.Combine(byteData,Bytes.ConvertToBytesUTF8(postData);
byte[] content = byteData;

public class Bytes
{
    public static byte[] ConvertToBytesUTF8(string postData)
    {
        byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(postData);
        return byteArray;
    }

    public static byte[] Combine(params byte[][] arrays)
    {
        byte[] rv = new byte[arrays.Sum(a => a.Length)];
        int offset = 0;
        foreach (byte[] array in arrays)
        {
            System.Buffer.BlockCopy(array, 0, rv, offset, array.Length);
            offset += array.Length;
        }
        return rv;
    }
}

如果 curl 包含 -d 而不是 -F 我一直在执行以下操作,将内容作为字节传递给变量 content 但是,在我不得不使用的任何 curl 中,它只有 1 - d 所以我从来没有像上面那样组合字节。

request = WebRequest.Create(connectionstring);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
if (content != null)
{
   request.ContentLength = content.Length;
}

Stream dataStream = request.GetRequestStream();

if (content!=null && content.Length > 0)
{
   dataStream.Write(content, 0, content.Length);
}

dataStream.Close();

WebResponse response = request.GetResponse();

dataStream = response.GetResponseStream();

StreamReader reader = new StreamReader (dataStream);

string responseReader = reader.ReadToEnd();

reader.Close();
dataStream.Close();
response.Close();

return responseReader;

cURL -F 需要做什么?我尝试使用将数据传递到 header 和请求中的方法,但都无法传递 -F 字段。我从接收方收到错误 Ill-formed request parameter cannot be converted to Java field type. 它说问题出在 documentFile 上。我还将 documentFile 的字节和 xml 部分背靠背组合在一起。这是问题吗?我需要在两者之间使用某种分隔符吗?这也是我第一次同时传递多个文件。

这是我有兴趣使用 WebRequest

复制的 curl 语句
curl -k -X POST
-b "ssoGlobalSessionID=YOUR_SESSION_ID"
–F "documentFile=@/Users/User/Test.PDF"
–F "xml=XML_REQUEST.XML" 
"url"

在 curl 中复制此语句

curl -k -X POST
-b "ssoGlobalSessionID=YOUR_SESSION_ID"
–F "documentFile=@c:/Users/User/Test.PDF"
–F "xml=XML_REQUEST.XML" 
"url"

这是适用于 C# 的代码

StringBuilder contents = new StringBuilder();
byte[] content=null;
string header = "ssoGlobalSessionID=YOUR_SESSION_ID";
string documentfile = "c:/Users/User/Test.PDF";
string filename = Path.GetFileName(file);
static string boundary = Guid.NewGuid().ToString();
WebRequest request = WebRequest.Create(url);
request.Method = "POST";
request.ContentType = string.Format("multipart/form-data; boundary={0}, boundary);
request.Headers.Add(HttpRequestHeader.Cookie, header);
AddContentFileCurl(File.ReadAllBytes(documentfile), "documentFile", filename);
AddContentFormCurl(System.Text.Encoding.ASCII.GetBytes("XMLMARKUP"),"xml");
LastFileAddedCurl();
if (content != null)
{
   request.ContentLength = content.Length;
}

Stream dataStream = request.GetRequestStream();

if (content!=null && content.Length > 0)
{
   dataStream.Write(content, 0, content.Length);
}

dataStream.Close();

WebResponse response = request.GetResponse();

dataStream = response.GetResponseStream();

StreamReader reader = new StreamReader (dataStream);

string responseReader = reader.ReadToEnd();

reader.Close();
dataStream.Close();
response.Close();

我为此创建的 3 个方法和一个 class 我从另一个 post 获得的用于 MIMETypes 的方法我在下面复制了。

public void AddContentFileCurl(byte[] file, string name, string filename)
    {
        string header = string.Format("--{0}", boundary);
        string fileContentType = MIMEAssistant.GetMIMEType(filename);                       
        contents.AppendLine(header);
        string fileHeader=String.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"",name,filename);
        string fileData = Encoding.UTF8.GetString(file);
        contents.AppendLine(fileHeader);
        contents.AppendLine(String.Format("Content-Type: {0}", fileContentType));
        contents.AppendLine();
        contents.AppendLine(fileData);
    }

public void AddContentFormCurl(byte[] file, string name)
    {
        string header = string.Format("--{0}", boundary);
        contents.AppendLine(header);
        string fileHeader = String.Format("Content-Disposition: form-data; name=\"{0}\"", name);
        string fileData = Encoding.UTF8.GetString(file);
        contents.AppendLine(fileHeader);
        contents.AppendLine();
        contents.AppendLine(fileData);
    }

public void LastFileAddedCurl()
    {
        string footer = string.Format("--{0}--", boundary);         
        contents.AppendLine(footer);
        string cstring = contents.ToString();
        byte[] bytes = Encoding.UTF8.GetBytes(cstring);
        if (content != null)
        {
            content = Bytes.Combine(content, bytes);
        }
        else
        {
            content = bytes;
        }
    }

MIME 类型

public static class MIMEAssistant
{
    private static readonly Dictionary<string, string> MIMETypesDictionary = new Dictionary<string, string>
{
{"ai", "application/postscript"},
{"aif", "audio/x-aiff"},
{"aifc", "audio/x-aiff"},
{"aiff", "audio/x-aiff"},
{"asc", "text/plain"},
{"atom", "application/atom+xml"},
{"au", "audio/basic"},
{"avi", "video/x-msvideo"},
{"bcpio", "application/x-bcpio"},
{"bin", "application/octet-stream"},
{"bmp", "image/bmp"},
{"cdf", "application/x-netcdf"},
{"cgm", "image/cgm"},
{"class", "application/octet-stream"},
{"cpio", "application/x-cpio"},
{"cpt", "application/mac-compactpro"},
{"csh", "application/x-csh"},
{"css", "text/css"},
{"dcr", "application/x-director"},
{"dif", "video/x-dv"},
{"dir", "application/x-director"},
{"djv", "image/vnd.djvu"},
{"djvu", "image/vnd.djvu"},
{"dll", "application/octet-stream"},
{"dmg", "application/octet-stream"},
{"dms", "application/octet-stream"},
{"doc", "application/msword"},
{"docx","application/vnd.openxmlformats-officedocument.wordprocessingml.document"},
{"dotx", "application/vnd.openxmlformats-officedocument.wordprocessingml.template"},
{"docm","application/vnd.ms-word.document.macroEnabled.12"},
{"dotm","application/vnd.ms-word.template.macroEnabled.12"},
{"dtd", "application/xml-dtd"},
{"dv", "video/x-dv"},
{"dvi", "application/x-dvi"},
{"dxr", "application/x-director"},
{"eps", "application/postscript"},
{"etx", "text/x-setext"},
{"exe", "application/octet-stream"},
{"ez", "application/andrew-inset"},
{"gif", "image/gif"},
{"gram", "application/srgs"},
{"grxml", "application/srgs+xml"},
{"gtar", "application/x-gtar"},
{"hdf", "application/x-hdf"},
{"hqx", "application/mac-binhex40"},
{"htm", "text/html"},
{"html", "text/html"},
{"ice", "x-conference/x-cooltalk"},
{"ico", "image/x-icon"},
{"ics", "text/calendar"},
{"ief", "image/ief"},
{"ifb", "text/calendar"},
{"iges", "model/iges"},
{"igs", "model/iges"},
{"jnlp", "application/x-java-jnlp-file"},
{"jp2", "image/jp2"},
{"jpe", "image/jpeg"},
{"jpeg", "image/jpeg"},
{"jpg", "image/jpeg"},
{"js", "application/x-javascript"},
{"kar", "audio/midi"},
{"latex", "application/x-latex"},
{"lha", "application/octet-stream"},
{"lzh", "application/octet-stream"},
{"m3u", "audio/x-mpegurl"},
{"m4a", "audio/mp4a-latm"},
{"m4b", "audio/mp4a-latm"},
{"m4p", "audio/mp4a-latm"},
{"m4u", "video/vnd.mpegurl"},
{"m4v", "video/x-m4v"},
{"mac", "image/x-macpaint"},
{"man", "application/x-troff-man"},
{"mathml", "application/mathml+xml"},
{"me", "application/x-troff-me"},
{"mesh", "model/mesh"},
{"mid", "audio/midi"},
{"midi", "audio/midi"},
{"mif", "application/vnd.mif"},
{"mov", "video/quicktime"},
{"movie", "video/x-sgi-movie"},
{"mp2", "audio/mpeg"},
{"mp3", "audio/mpeg"},
{"mp4", "video/mp4"},
{"mpe", "video/mpeg"},
{"mpeg", "video/mpeg"},
{"mpg", "video/mpeg"},
{"mpga", "audio/mpeg"},
{"ms", "application/x-troff-ms"},
{"msh", "model/mesh"},
{"mxu", "video/vnd.mpegurl"},
{"nc", "application/x-netcdf"},
{"oda", "application/oda"},
{"ogg", "application/ogg"},
{"pbm", "image/x-portable-bitmap"},
{"pct", "image/pict"},
{"pdb", "chemical/x-pdb"},
{"pdf", "application/pdf"},
{"pgm", "image/x-portable-graymap"},
{"pgn", "application/x-chess-pgn"},
{"pic", "image/pict"},
{"pict", "image/pict"},
{"png", "image/png"}, 
{"pnm", "image/x-portable-anymap"},
{"pnt", "image/x-macpaint"},
{"pntg", "image/x-macpaint"},
{"ppm", "image/x-portable-pixmap"},
{"ppt", "application/vnd.ms-powerpoint"},
{"pptx","application/vnd.openxmlformats-officedocument.presentationml.presentation"},
{"potx","application/vnd.openxmlformats-officedocument.presentationml.template"},
{"ppsx","application/vnd.openxmlformats-officedocument.presentationml.slideshow"},
{"ppam","application/vnd.ms-powerpoint.addin.macroEnabled.12"},
{"pptm","application/vnd.ms-powerpoint.presentation.macroEnabled.12"},
{"potm","application/vnd.ms-powerpoint.template.macroEnabled.12"},
{"ppsm","application/vnd.ms-powerpoint.slideshow.macroEnabled.12"},
{"ps", "application/postscript"},
{"qt", "video/quicktime"},
{"qti", "image/x-quicktime"},
{"qtif", "image/x-quicktime"},
{"ra", "audio/x-pn-realaudio"},
{"ram", "audio/x-pn-realaudio"},
{"ras", "image/x-cmu-raster"},
{"rdf", "application/rdf+xml"},
{"rgb", "image/x-rgb"},
{"rm", "application/vnd.rn-realmedia"},
{"roff", "application/x-troff"},
{"rtf", "text/rtf"},
{"rtx", "text/richtext"},
{"sgm", "text/sgml"},
{"sgml", "text/sgml"},
{"sh", "application/x-sh"},
{"shar", "application/x-shar"},
{"silo", "model/mesh"},
{"sit", "application/x-stuffit"},
{"skd", "application/x-koan"},
{"skm", "application/x-koan"},
{"skp", "application/x-koan"},
{"skt", "application/x-koan"},
{"smi", "application/smil"},
{"smil", "application/smil"},
{"snd", "audio/basic"},
{"so", "application/octet-stream"},
{"spl", "application/x-futuresplash"},
{"src", "application/x-wais-source"},
{"sv4cpio", "application/x-sv4cpio"},
{"sv4crc", "application/x-sv4crc"},
{"svg", "image/svg+xml"},
{"swf", "application/x-shockwave-flash"},
{"t", "application/x-troff"},
{"tar", "application/x-tar"},
{"tcl", "application/x-tcl"},
{"tex", "application/x-tex"},
{"texi", "application/x-texinfo"},
{"texinfo", "application/x-texinfo"},
{"tif", "image/tiff"},
{"tiff", "image/tiff"},
{"tr", "application/x-troff"},
{"tsv", "text/tab-separated-values"},
{"txt", "text/plain"},
{"ustar", "application/x-ustar"},
{"vcd", "application/x-cdlink"},
{"vrml", "model/vrml"},
{"vxml", "application/voicexml+xml"},
{"wav", "audio/x-wav"},
{"wbmp", "image/vnd.wap.wbmp"},
{"wbmxl", "application/vnd.wap.wbxml"},
{"wml", "text/vnd.wap.wml"},
{"wmlc", "application/vnd.wap.wmlc"},
{"wmls", "text/vnd.wap.wmlscript"},
{"wmlsc", "application/vnd.wap.wmlscriptc"},
{"wrl", "model/vrml"},
{"xbm", "image/x-xbitmap"},
{"xht", "application/xhtml+xml"},
{"xhtml", "application/xhtml+xml"},
{"xls", "application/vnd.ms-excel"},                        
{"xml", "application/xml"},
{"xpm", "image/x-xpixmap"},
{"xsl", "application/xml"},
{"xlsx","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},
{"xltx","application/vnd.openxmlformats-officedocument.spreadsheetml.template"},
{"xlsm","application/vnd.ms-excel.sheet.macroEnabled.12"},
{"xltm","application/vnd.ms-excel.template.macroEnabled.12"},
{"xlam","application/vnd.ms-excel.addin.macroEnabled.12"},
{"xlsb","application/vnd.ms-excel.sheet.binary.macroEnabled.12"},
{"xslt", "application/xslt+xml"},
{"xul", "application/vnd.mozilla.xul+xml"},
{"xwd", "image/x-xwindowdump"},
{"xyz", "chemical/x-xyz"},
{"zip", "application/zip"}
};

public static string GetMIMEType(string fileName)
{
        //get file extension
        string extension = Path.GetExtension(fileName).ToLowerInvariant();

        if (extension.Length > 0 &&
            MIMETypesDictionary.ContainsKey(extension.Remove(0, 1)))
        {
            return MIMETypesDictionary[extension.Remove(0, 1)];
        }
        return "unknown/unknown";
}
}