Posting a file: .NET calling a WebScript:
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
02-21-2008 12:29 PM
I am trying to post a file to alfresco by calling a web script from a .net application. I have tested the webscript by calling it from a html form that posts the file and it works fine.
When I try it from the .net app the formdata.fields collection always contains 0 items.
The main .net code is shown below.
Any help appreciated.
Thanks,
When I try it from the .net app the formdata.fields collection always contains 0 items.
The main .net code is shown below.
Any help appreciated.
Thanks,
public static string UploadFileEx(string uploadfile, string url,string fileFormName, string contenttype, NameValueCollection querystring,CookieContainer cookies){if ((fileFormName == null) ||(fileFormName.Length == 0)){fileFormName = "file";}if ((contenttype == null) ||(contenttype.Length == 0)){contenttype = "application/octet-stream";}string postdata;postdata = "?";if (querystring != null){foreach (string key in querystring.Keys){postdata += key + "=" + querystring.Get(key) + "&";}}Uri uri = new Uri(url + postdata);string boundary = "———-" + DateTime.Now.Ticks.ToString("x");HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(uri);webrequest.CookieContainer = cookies;webrequest.ContentType = "multipart/form-data; boundary=" + boundary;webrequest.Method = "POST";// Build up the post message headerStringBuilder sb = new StringBuilder();sb.Append("–");sb.Append(boundary);sb.Append("\r\n");sb.Append("Content-Disposition: form-data; name=\"");sb.Append(fileFormName);sb.Append("\"; filename=\"");sb.Append(Path.GetFileName(uploadfile));sb.Append("\"");sb.Append("\r\n");sb.Append("Content-Type: ");sb.Append(contenttype);sb.Append("\r\n");sb.Append("\r\n");string postHeader = sb.ToString();byte[] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader);// Build the trailing boundary string as a byte array// ensuring the boundary appears on a line by itselfbyte[] boundaryBytes =Encoding.ASCII.GetBytes("\r\n–" + boundary + "\r\n");FileStream fileStream = new FileStream(uploadfile,FileMode.Open, FileAccess.Read);long length = postHeaderBytes.Length + fileStream.Length +boundaryBytes.Length;webrequest.ContentLength = length;Stream requestStream = webrequest.GetRequestStream();// Write out our post headerrequestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);// Write out the file contentsbyte[] buffer = new Byte[checked((uint)Math.Min(4096,(int)fileStream.Length))];int bytesRead = 0;while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)requestStream.Write(buffer, 0, bytesRead);// Write out the trailing boundaryrequestStream.Write(boundaryBytes, 0, boundaryBytes.Length);WebResponse responce = webrequest.GetResponse();Stream s = responce.GetResponseStream();StreamReader sr = new StreamReader(s);return sr.ReadToEnd();}
Labels:
- Labels:
-
Archive
3 REPLIES 3

Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
02-21-2008 01:06 PM
I'd suggest sniffing the request for both the html form submission and your programmatic submission. I suspect the programmatic one isn't correct.
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
02-21-2008 04:13 PM
Just to add to David's comment, you might find the free Microsoft tool Fiddler2 useful for sniffing the HTTP traffic.
Get it from http://www.fiddler2.com/
Mike
Get it from http://www.fiddler2.com/
Mike
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
02-22-2008 01:00 PM
We got .net to successfully call the upload web script. We ended up using a combination of query string parameters to send the indexing values and a post for the file itself.
The code is shown below:
.NET Code
The web script code:
The code is shown below:
.NET Code
WebClient w = new WebClient();w.Credentials = new NetworkCredential("admin", "admin");w.QueryString.Add("occno", "556677");w.QueryString.Add("docid", "321");w.QueryString.Add("occdate", DateTime.Now.ToShortDateString());w.QueryString.Add("docdate", DateTime.Now.ToShortDateString());w.QueryString.Add("claimno", "1");w.QueryString.Add("docname", "DocumentInventory.doc");w.QueryString.Add("source", "TEST");w.QueryString.Add("location", "G360 Backfile");w.UploadFile("http://tw6-vm1:8080/alfresco/service/cdi/Upload", "POST", @"C:\DocumentInventory.doc");
The web script code:
function initRequest(){ var oRequest = new alfAddRequest(); addItem(oRequest, 'occno'); addItem(oRequest, 'claimno'); addItem(oRequest, 'docname'); addItem(oRequest, 'docdate'); addItem(oRequest, 'docid'); addItem(oRequest, 'source'); addItem(oRequest, 'location'); addItem(oRequest, 'occdate'); addFile(oRequest); return oRequest;}function addItem(objDest, strItemName) { if(args[strItemName] != null) { eval('objDest.' + strItemName + ' = args[strItemName];'); } else { for each(field in formdata.fields) { if(field.name == strItemName) { eval('objDest.' + strItemName + ' = field.value'); break; } } }}function addFile(objDest) { //Only adds the first file found! //Could be modified to add multiple files for each (field in formdata.fields) { if(field.isFile) { objDest.filename = field.filename; objDest.content = field.content; break; } } }
