SL 4:简单的文件上传,为什么这不起作用?

时间:2010-09-21 15:00:10

标签: c# .net silverlight file-upload silverlight-4.0

我在以下代码中没有得到任何异常,但是我也没有看到假设要上传到服务器的文件(在本例中是localhost) - 有人可以指出错误吗?

作为补充,我需要一个带有进度条的简单的silverlight文件上传器,但是我很难尝试使用codeplex上的那些,这里有没有人对SL4有好处?

public FileStream MyFS { get; set; }

private void UploadFile()
{
    FileStream _data; // The file stream to be read
    _data = MyFS;
    string uploadUri;
    uploadUri = @"http://localhost/MyApplication/Upload/Images/testXRay.gif";

    byte[] fileContent = new byte[_data.Length]; // Read the contents of the stream into a byte array
    int dataLength = int.Parse(_data.Length.ToString());
    _data.Read(fileContent, 0, dataLength);

    WebClient wc = new WebClient();
    wc.OpenWriteCompleted += new OpenWriteCompletedEventHandler(wc_OpenWriteCompleted);
    Uri u = new Uri(uploadUri);
    wc.OpenWriteAsync(u, null, fileContent); // Upload the file to the server
}

void wc_OpenWriteCompleted(object sender, OpenWriteCompletedEventArgs e) // The upload completed
{
    if (e.Error == null)
    {
        // Upload completed without error
    }
}

谢谢,

巫毒

2 个答案:

答案 0 :(得分:3)

您正在尝试写入作为图片的服务器网址,而不是服务:

uploadUri = @"http://localhost/MyApplication/Upload/Images/testXRay.gif";
...
Uri u = new Uri(uploadUri);
wc.OpenWriteAsync(u, null, fileContent);

你不能只是将文件(通过HTTP)写入这样的网络服务器。接收URL必须是一个旨在接受传入字节流的Web服务。

我相信有更好的例子,但请先尝试this link

答案 1 :(得分:1)

您的代码的另一个问题是您根本没有尝试编写该文件。

这一行不符合您的想法:

  

wc.OpenWriteAsync(你,null,   fileContent); //将文件上传到   服务器

呼叫签名是OpenWriteAsync(URI,HTTPMETHOD,UserToken)。

让我稍微打破一下。 URI我认为你有。 HTTPMETHOD允许您设置是发布帖子还是获取。可能你想做一个HttpPost。最后,最后一项不是用于推送文件内容。它更像是一个状态变量,因此您可以跟踪请求(稍后会详细介绍)。

HTTP Stack在Silverlight中的工作方式是一切都是异步的。因此,在您的情况下,您正在设置请求,然后告诉运行时您要将某些数据写入请求。这就是你的电话。它出来并设置为允许您发出请求(这可能都发生在后台线程而不是UI更新的线程)。设置完成后,它将使用您可以写入的流来调用您的回调事件。它发回给你的一件事是状态变量(UserToken),它使你能够知道它回复给你的请求(这意味着你可以同时将多个文件发送回服务器)

它还会公开一些其他事件,您可以使用它们查看是否一切正常(就像您可以从您的电话中获得响应并查看状态代码是什么 - 它会告诉您一切是否成功或不)。顺便说一下,每次回调它都会发送UserToken变量,这样你的应用就可以跟踪响应的请求(如果现在有多个请求)。

最后一个人提供的链接可以帮助你解决一些问题。他也是对的,您需要服务器设置上的某些内容来响应请求,或者您通常希望这样做。您可以设置一个文件夹以允许您直接将数据推送到该文件夹​​,但老实说,您不希望这样做,因为您将打开服务器以供黑客利用。