File upload 仅对';支持上载内容;http';和';https';计划

File upload 仅对';支持上载内容;http';和';https';计划,file-upload,windows-8,winrt-async,File Upload,Windows 8,Winrt Async,我正在尝试将文件上载到ftp服务器,我使用以下代码: Uri uri; if (!Uri.TryCreate(serverAddressField.Text.Trim(), UriKind.Absolute, out uri)) { rootPage.NotifyUser("Invalid URI.", NotifyType.ErrorMessage); return; } // V

我正在尝试将文件上载到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,文件); “Microsoft.Samples.Networking.BackgroundTransfer.exe中发生“System.ArgumentException”类型的异常,但未在用户代码中处理


WinRT信息:“uri”:仅“http”和“https”方案支持上载内容。“

您的答案就在异常消息中

引述:

支持FTP,但仅在执行下载操作时支持

因此,您不能将
BackgroundUploader
与FTP一起使用。

公共异步函数FTP\u Uploader(ftpURL作为字符串,filename作为字符串,username作为字符串,password作为字符串,file作为存储文件)作为任务(布尔值)
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
尝试 Dim请求为WebRequest=WebRequest.Create(ftpURL+“/”+文件名) request.Credentials=New System.Net.NetworkCredential(username.Trim(),password.Trim()) request.Method=“STOR” 将缓冲区设置为字节()=ReadFiletoBinary(文件名,文件名) Dim requestStream As Stream=等待请求。GetRequestStreamAsync() wait requestStream.WriteAsync(缓冲区,0,缓冲区.Length) 等待requestStream.FlushAsync() 返回真值 特例 返回错误 结束尝试 端函数 公共共享异步函数ReadFileToBinary(ByVal文件名为字符串,文件为StorageFile)作为任务(字节()) Dim readStream作为irandomaccesstream=Await file.OpenAsync(FileAccessMode.Read) Dim inputStream作为IIInputStream=readStream.GetInputStreamAt(0) Dim dataReader As dataReader=新dataReader(inputStream) Dim NUMBYTES标记为UInt64=等待dataReader.LoadAsync(Convert.ToUInt64(readStream.Size)) Dim i As UInt64 作为字节的Dim b Dim返回值(numBytesLoaded)作为字节 而我却走了 inputStream=readStream.GetInputStreamAt(i) b=dataReader.ReadByte() 返回值(i)=b i=i+1 结束时 readStream.Dispose() inputStream.Dispose() dataReader.Dispose() 返回值 端函数
有同样的问题,这对我来说很有效!:)

我突然碰到了同样的问题。经过一天的工作,我让它与WebRequest类一起工作

具有下载功能的完整工作应用程序可在以下位置获得:

我修改了这段代码以允许上传到服务器

这用于上载文件:

public async Task UploadFTPFileAsync(Uri目标,StorageFile targetFile)
{
var request=WebRequest.Create(目的地);
请求.凭据=凭据;
request.Method=“STOR”;
使用(var requestStream=(wait request.GetRequestStreamAsync())
使用(var stream=await targetFile.OpenStreamForReadAsync())
{
CopyTo(requestStream);
}
}
这是用来创建目录的:

public异步任务createftpdirectorysync(Uri目录)
{
var request=WebRequest.Create(目录);
请求.凭据=凭据;
request.Method=“MKD”;
使用(var response=(wait request.GetResponseAsync())
{
//冲洗
//使用将调用(隐藏!)close方法,该方法将完成请求。
}
}
request.Credentials
可以用NetworkCredential填充,如下所示:

私有字符串strftAccount;
私有字符串strFtpPassword;
私有字符串strFtpDomain;
公共ICredentials凭证
{
得到
{
返回新的网络凭据(strFtpAccount、strFtpPassword、strFtpDomain);
}
}

您可以在应用程序运行时执行常规FTP上载,也可以编写一个HTTP服务器,接受上载并将其推送到FTP服务器。没有办法进行后台FTP上传。你好,Stephan,谢谢你的回复!你能给我举个例子吗?我真的找不到关于这个目的的任何东西。您必须对其进行修改,使其与WinRT streams异步工作,但这应该会给您一个大致的想法。但是metro应用程序中不支持FtpWebRequest,请您帮我举一个如何处理它的示例,好吗?看起来Microsoft不支持它,所以我建议使用第三方组件。