代码之家  ›  专栏  ›  技术社区  ›  VoodooChild

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

  •  0
  • VoodooChild  · 技术社区  · 14 年前

    作为一个附加组件,我需要一个简单的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 回复  |  直到 14 年前
        1
  •  3
  •   iCollect.it Ltd    14 年前

    您试图写入的服务器URL是图像,而不是服务:

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

    你不能只把一个文件(通过HTTP)写到那样的web服务器上。接收URL需要是一个设计为接受传入字节流的web服务。

    我相信有更好的例子,但试试看 this link

        2
  •  1
  •   DevTheo    14 年前

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

    这句话跟你想的不一样:

    wc.OpenWriteAsync(u,空, fileContent);//上传到 服务器

    让我把它分解一下。我想你有。HTTPMETHOD允许您设置是执行post还是get。可能你想做一个HttpPost。最后一项不是用来推送文件内容的。它更像是一个状态变量,因此您可以跟踪请求(稍后将详细介绍)。

    在Silverlight中,HTTP堆栈的工作方式是一切都是异步的。因此,在您的案例中,您正在设置一个请求,然后告诉运行时您想向该请求写入一些数据。你的电话就是这么做的。它发出并设置为允许您发出请求(这可能都发生在后台线程上,而不是UI更新的线程上)。一旦设置好,它将用一个流调用回调事件,您可以对其进行写入。它返回给您的其中一件事是状态变量(UserToken),它使您能够知道它用哪个请求响应您(这意味着您可以同时将多个文件发送回服务器)。

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

    最后一个家伙提供的链接应该能帮到你。他也是对的,您需要服务器设置上的一些东西来响应请求,或者您通常希望这样做。你可以设置一个文件夹,让你把数据直接推到它,但老实说,你不想这样做,因为你会打开你的服务器黑客利用。