Загрузка контента поддерживается только для схем "http" и "https".
Я пытаюсь загрузить файл на FTP-сервер, я использую этот код:
Uri uri;
if (!Uri.TryCreate(serverAddressField.Text.Trim(), UriKind.Absolute, out uri))
{
rootPage.NotifyUser("Invalid URI.", NotifyType.ErrorMessage);
return;
}
// Verify that we are currently not snapped, or that we can unsnap to open the picker.
if (ApplicationView.Value == ApplicationViewState.Snapped && !ApplicationView.TryUnsnap())
{
rootPage.NotifyUser("File picker cannot be opened in snapped mode. Please unsnap first.", NotifyType.ErrorMessage);
return;
}
FileOpenPicker picker = new FileOpenPicker();
picker.FileTypeFilter.Add("*");
StorageFile file = await picker.PickSingleFileAsync();
if (file == null)
{
rootPage.NotifyUser("No file selected.", NotifyType.ErrorMessage);
return;
}
PasswordCredential pw = new PasswordCredential();
pw.Password = "pass";
pw.UserName = "username";
BackgroundUploader uploader = new BackgroundUploader();
uploader.ServerCredential = pw;
uploader.Method = "POST";
uploader.SetRequestHeader("Filename", file.Name);
UploadOperation upload = uploader.CreateUpload(uri, file);
Log(String.Format("Uploading {0} to {1}, {2}", file.Name, uri.AbsoluteUri, upload.Guid));
// Attach progress and completion handlers.
await HandleUploadAsync(upload, true);
но он отправляет мне это исключение здесь: UploadOperation upload = uploader.CreateUpload(uri, file); "Исключение типа" System.ArgumentException "произошло в Microsoft.Samples.Networking.BackgroundTransfer.exe, но не было обработано в коде пользователя
Информация WinRT: "uri": загрузка контента поддерживается только для схем "http" и "https". "
3 ответа
Ваш ответ прямо в сообщении об исключении.
Цитировать документацию:
FTP поддерживается, но только при выполнении операций загрузки.
Так что вы не можете использовать BackgroundUploader
с FTP.
Public Async Function FTP_Uploader(ftpURL As String, filename As String, username As String, password As String, file as StorageFile) As Task(Of Boolean)
Try
Dim request As WebRequest = WebRequest.Create(ftpURL + "/" + filename)
request.Credentials = New System.Net.NetworkCredential(username.Trim(), password.Trim())
request.Method = "STOR"
Dim buffer As Byte() = ReadFiletoBinary(filename, file)
Dim requestStream As Stream = Await request.GetRequestStreamAsync()
Await requestStream.WriteAsync(buffer, 0, buffer.Length)
Await requestStream.FlushAsync()
Return True
Catch ex As Exception
Return False
End Try
End Function
Public Shared Async Function ReadFileToBinary(ByVal filename As String, file As StorageFile) As Task(Of Byte())
Dim readStream As IRandomAccessStream = Await file.OpenAsync(FileAccessMode.Read)
Dim inputStream As IInputStream = readStream.GetInputStreamAt(0)
Dim dataReader As DataReader = New DataReader(inputStream)
Dim numBytesLoaded As UInt64 = Await dataReader.LoadAsync(Convert.ToUInt64(readStream.Size))
Dim i As UInt64
Dim b As Byte
Dim returnvalue(numBytesLoaded) As Byte
While i < numBytesLoaded
inputStream = readStream.GetInputStreamAt(i)
b = dataReader.ReadByte()
returnvalue(i) = b
i = i + 1
End While
readStream.Dispose()
inputStream.Dispose()
dataReader.Dispose()
Return returnvalue
End Function
Была такая же проблема, это работало на меня!:)
Я наткнулся на ту же проблему. После рабочего дня я начал работать с классом WebRequest.
Полностью работающее приложение с возможностью загрузки доступно здесь: http://code.msdn.microsoft.com/windowsapps/CSWindowsStoreAppFTPDownloa-88a90bd9
Я изменил этот код, чтобы разрешить загрузку на сервер тоже.
Это для загрузки файлов:
public async Task UploadFTPFileAsync(Uri destination, StorageFile targetFile)
{
var request = WebRequest.Create(destination);
request.Credentials = Credentials;
request.Method = "STOR";
using (var requestStream = (await request.GetRequestStreamAsync()))
using (var stream = await targetFile.OpenStreamForReadAsync())
{
stream.CopyTo(requestStream);
}
}
И это для создания каталогов:
public async Task CreateFTPDirectoryAsync(Uri directory)
{
var request = WebRequest.Create(directory);
request.Credentials = Credentials;
request.Method = "MKD";
using (var response = (await request.GetResponseAsync()))
{
//flush
//using will call the (hidden!) close method, which will finish the request.
}
}
request.Credentials
может быть заполнен NetworkCredential, например так:
private string strFtpAccount;
private string strFtpPassword;
private string strFtpDomain;
public ICredentials Credentials
{
get
{
return new NetworkCredential(strFtpAccount, strFtpPassword, strFtpDomain);
}
}