cancel
Showing results for 
Search instead for 
Did you mean: 

Posting a file: .NET calling a WebScript:

eg
Champ in-the-making
Champ in-the-making
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,

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 header

StringBuilder 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 itself

byte[] 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 header

requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);

// Write out the file contents

byte[] 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 boundary

requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
WebResponse responce = webrequest.GetResponse();
Stream s = responce.GetResponseStream();
StreamReader sr = new StreamReader(s);

return sr.ReadToEnd();
}
3 REPLIES 3

davidc
Star Contributor
Star Contributor
I'd suggest sniffing the request for both the html form submission and your programmatic submission.  I suspect the programmatic one isn't correct.

mikeh
Star Contributor
Star Contributor
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

eg
Champ in-the-making
Champ in-the-making
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
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;
      }
   }
         
}