Wer versuch mit der API von Windows-Phone (7, 7.5, 8) eine Datei auf einem Webserver hochzuladen, wird schnell merken, dass die einfach zu nutzende WebClient-Klasse hierfür keine Funktionen zur Verfügung stellt.

Wer keine Lust hat in den Tiefen des HttpWebRequest zu irren, der nutzt dazu am Besten vorhandene Bibliotheken der Community. Ein Dateiupload lässt sich zum Beispiel mit RestSharp realisieren.

In meinem Beispiel will ich eine Datei aus einem bestimmten Verzeichnis des IsolatedStorage hochladen.

Schritt 1: Ermittlung des Dateipfades

var directoryName = "FilesToUpload";

string[] files = null;

// get all files from the isolatedstorage in the specified directory
using (var storage = IsolatedStorageFile.GetUserStoreForApplication())
{
	// if the directory does not exists, there is nothing to do
	if (!storage.DirectoryExists(directoryName))
	{
		return;
	}

	files = storage.GetFileNames(Path.Combine(directoryName, "*.xml"));
}

// if there is no file present in the directory,
// there is nothing to do either
if (files == null || files.Length == 0)
{
	return;
}

// use the first file for upload
var filePath = Path.Combine(directoryName, files[0]);

Schritt 2: Formulierung des Webrequests

var client = new RestClient("http://www.uploadurl.de");
var request = new RestRequest(Method.POST);
request.AddFile("upload", ReadFile(filePath), Path.GetFileName(filePath));

client.ExecuteAsync(request, response =>
{
	// custom code, after upload did finish
});

Schritt 3: Datei für den Upload als byte-array lesen

private byte[] ReadFile(string filePath)
{
	var bytes = new List<byte>();

	using (var storage = IsolatedStorageFile.GetUserStoreForApplication())
	{
		using (var stream = storage.OpenFile(_currentFeedbackFilePath, FileMode.Open, FileAccess.Read))
		{
			byte[] buffer = new byte[1024];
			var offset = 0;
			var readBytes = 0;
			do
			{
				readBytes = stream.Read(buffer, offset, buffer.Length);

				if (readBytes > 0)
				{
					if (readBytes == buffer.Length)
					{
						bytes.AddRange(buffer);
					}
					else
					{
						var writtenBytes = new byte[readBytes];
						Array.Copy(buffer, writtenBytes, readBytes);

						bytes.AddRange(writtenBytes);
					}
				}

			} while (readBytes == buffer.Length);
		}
	}

	return bytes.ToArray();
}