Uploading Files Using .NET

This .NET source code uploads files to Plesk. Change values of the Hostname, Login, Password, and Protocol variables with parameters of your Plesk server. Change value of the Filename variable with full name of the file you want to upload.

 

Filename

Full name of the file to be uploaded.

Hostname

The IP address or name of the Plesk server.

Login

Login name of the Plesk Administrator.

Password

Password of the Plesk Administrator.

Protocol

Version of the protocol.

 

using System;
using System.Net;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Schema;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
 
namespace ConsoleApplication1
 
 public class Request
  // Public interface
  // 
  public string Filename = "./tmp/myfile.sh";   // Upload file name;
  public string Hostname = "localhost";	// Control Panel Hostname
  public string Login = "admin";		// Administrator Login
  public string Password = "setup";		// Administrator Password
  public string Protocol = "1.4.2.0";	// API RPC Version Protocol. Now avaiable the followings: 
  //		1.3.5.1
  //		1.4.0.0
  //		1.4.1.0
  //		1.4.1.1
  //		1.4.1.2
  //		1.4.2.0
 
  // Handler for receiving information about document type definition (DTD),
  // XML-Data Reduced (XDR) schema, and XML Schema definition language (XSD) schema validation errors. 
  public ValidationEventHandler XmlSchemaValidation = null;
 
  public Request() 
 
  public string AgentEntryPoint { get { return "https://" + Hostname + ":8443/enterprise/control/agent.php"; } } 
 
  public string InputValidationSchema { get { return "https://" + Hostname + ":8443/schemas/rpc/" + Protocol + "/agent_input.xsd"; } } 
  public string OutputValidationSchema { get { return "https://" + Hostname + ":8443/schemas/rpc/" + Protocol + "/agent_output.xsd"; } }
 
  public XmlDocument UploadFile(string uploadfile)
   HttpWebRequest request = (HttpWebRequest)WebRequest.Create(AgentEntryPoint); 
 
   string boundary = "----------" + DateTime.Now.Ticks.ToString("x"); 
 
   request.Headers.Add("HTTP_AUTH_LOGIN", Login); 
   request.Headers.Add("HTTP_AUTH_PASSWD", Password); 
   request.ContentType = "multipart/form-data; boundary=" + boundary; 
   request.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("sampfile");
   sb.Append("\"; filename=\"");
   sb.Append(Path.GetFileName(uploadfile));
   sb.Append("\"");
   sb.Append("\r\n");
   sb.Append("Content-Type: ");
   sb.Append("application/octet-stream");
   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;
   request.ContentLength = length;
   Stream stream = request.GetRequestStream();
 
   stream.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)
    stream.Write(buffer, 0, bytesRead);
 
   // Write out the trailing boundary
   stream.Write(boundaryBytes, 0, boundaryBytes.Length); 
 
   XmlDocument result = GetResponse(request);
   return result;
 
  // Private interface
  //
 
 
  // Parsing and validating packet 
  // 
  private XmlDocument ParseAndValidate(TextReader xml, string schemaUri)
  {
   XmlSchemaSet schemas = new XmlSchemaSet();
   schemas.Add(null, schemaUri);
 
   XmlReaderSettings settings = new XmlReaderSettings();
   if (XmlSchemaValidation != null)
    settings.ValidationEventHandler += new ValidationEventHandler(XmlSchemaValidation);
   settings.ValidationType = ValidationType.Schema;
   settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
   settings.Schemas = schemas;
 
   XmlDocument document = new XmlDocument();
 
   using (XmlReader reader = XmlTextReader.Create(xml, settings))
   {
    document.Load(reader);
   }
 
   return document;
  }
  private XmlDocument GetResponse(HttpWebRequest request)
  {
   using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
   using (Stream stream = response.GetResponseStream())
   using (TextReader reader = new StreamReader(stream))
   {
    return ParseAndValidate(reader, OutputValidationSchema);
   }
  }
 }
 
 class Program
 {
  static void Main(string[] args)
  {
   if (args.Length < 4)
   {
    Console.WriteLine("Usage: PleskApiRpcClient <Hostname> <Login> <Password> <FileName>");
    Console.WriteLine(" ");
    Console.WriteLine(" Hostname - Control Panel hostname");
    Console.WriteLine(" Login  - Administrator login");
    Console.WriteLine(" Password - Administrator password");
    Console.WriteLine(" FileName - Upload file name");
    return;
   }
 
   // Verifies the remote Secure Sockets Layer (SSL) certificate used for authentication.
   ServicePointManager.ServerCertificateValidationCallback =
    new RemoteCertificateValidationCallback(RemoteCertificateValidation);
 
   Request request = new Request();
   request.XmlSchemaValidation = XmlSchemaValidation;
 
   try
   {
    XmlDocument result = request.UploadFile(filename);
 
    PrintResult(result);
   }
   catch (Exception e)
   {
    Console.WriteLine("Request error: {0}", e.Message);
   }
  }
 
  // The following method is invoked by the RemoteCertificateValidationDelegate.
  private static bool RemoteCertificateValidation(object sender,
   X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
  {
   if (sslPolicyErrors != SslPolicyErrors.RemoteCertificateNotAvailable)
    return true;
 
   Console.WriteLine("Certificate error: {0}", sslPolicyErrors);
 
   // Do not allow this client to communicate with unauthenticated servers.
   return false;
  }
  // 
  private static void XmlSchemaValidation(object sender, ValidationEventArgs e)
  {
   Console.WriteLine("Validation error: {0}", e.Message);
  }
 
  static void PrintResult(XmlDocument document)
  {
   XmlTextWriter writer = new XmlTextWriter(Console.Out);
   writer.Formatting = Formatting.Indented;
 
   document.WriteTo(writer);
 
   writer.Flush();
   Console.WriteLine();
  }
 }
}