如何正确使用OpenWriteAsync方法将文件发布到URL?

时间:2019-02-18 06:35:03

标签: vb.net post upload stream webclient

我一直在使用UploadFileAsync方法来完成向远程服务器的文件上传,直到遇到一个文件大小超过1gb的文件为止,在该文件中RAM将达到该文件大小,并使应用程序崩溃。

经过一些研究,我不得不使用OpenWriteAsync函数以文件流的形式编写,而不是尝试一次读取整个文件,但是我一生无法找到可以工作的VB.NET示例,我试图从C#转换并使用我发现的东西,这是我拥有的东西:

Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, ByVal 
value As T) As T
        target = value
        Return value
    End Function
    Private Sub PushData(ByVal input As Stream, ByVal output As Stream)
        Dim buffer As Byte() = New Byte(4095) {}
        Dim bytesRead As Integer

    While (InlineAssignHelper(bytesRead, input.Read(buffer, 0, 
buffer.Length))) <> 0
        output.Write(buffer, 0, bytesRead)
    End While
End Sub
Private Sub UploadFile(ByVal fileName As String, ByVal data As Stream)
    Dim ub As New UriBuilder("http://someurl.com/uploader")

    Dim c As New WebClient
    AddHandler c.OpenWriteCompleted, AddressOf 
MyOpenWriteCompletedEventHandler
    c.OpenWriteAsync(ub.Uri)
End Sub

Public Sub MyOpenWriteCompletedEventHandler(ByVal sender As Object, ByVal 
e As OpenWriteCompletedEventArgs)
    PushData(Data, e.Result)
    e.Result.Close()
    Data.Close()
End Sub

在OpenWriteComplete事件处理程序上,我应作为数据传递什么变量?

openwriteasync函数还需要哪个处理程序来监视当前进度,该方法还会触发webclient对象中的UploadProgressChanged事件吗?

感谢您的时间。

编辑:

private void UploadFiles(MyFileInfo mfi, System.IO.FileStream data)
{
UriBuilder ub = new 
UriBuilder("http://localhost:3793/receiver.ashx");
ub.Query = string.Format("filename={0}&name={1}&address={2}&email= 
{3}&golfid={4}", mfi.Name, fixText(txtName.Text), fixText(txtAdress.Text), 
fixText(txtEmail.Text), fixText(txtGolfID.Text));
//ub.Query = string.Format("filename={0}", mfi.Name);
WebClient wc = new WebClient();

wc.OpenWriteCompleted += (sender, e) =>
        {
            PushData(data, e.Result, mfi);
            e.Result.Close();
            data.Close();
            lbl.Text = "Fil(er) uppladdade!";
        };
        wc.OpenWriteAsync(ub.Uri);
    } 

这是我尝试转换的部分的原始C#代码-我一直在寻找一个正常工作的VB.NET示例,它似乎确实不存在!

私有共享函数InlineAssignHelper(Of T)(ByRef目标为T,ByVal值为T)为T         目标=值         返回值     结束功能     私有子PushData(ByVal输入为流,ByVal输出为流)         昏暗的缓冲区为Byte()=新的Byte(4095){}         昏暗的字节读取为整数

    While (InlineAssignHelper(bytesRead, input.Read(buffer, 0, 
buffer.Length))) <> 0
        AddLog("Writing..")
        output.Write(buffer, 0, bytesRead)
    End While
End Sub

Private Sub UploadFileStream(uploadURL As String)
    Dim ub As New UriBuilder(uploadURL)
    AddLog("Uploading to: " & uploadURL)
    ub.Query = String.Format("file1={0}", "D:\test.flv")
    Dim c As New WebClient
    AddHandler c.OpenWriteCompleted, AddressOf OpenWriteCallback
    'AddHandler c.UploadProgressChanged, AddressOf OpenWriteProgress

    c.OpenWriteAsync(ub.Uri)


End Sub

Public Sub OpenWriteCallback(ByVal sender As Object, ByVal e As 
OpenWriteCompletedEventArgs)

    Dim fs As FileStream = File.OpenRead("D:\test.flv")
    AddLog("cb")
    PushData(fs, e.Result)

    If fs Is Nothing Then
            fs.Close()
        AddLog("done")
        MsgBox(e.Result)
    End If


End Sub

鉴于您的评论,我想出了这个,似乎是在写,但是在查看传出流量时,没有上载正在进行或服务器没有任何响应,直到它停止或崩溃并出现内存错误,任何想法为什么这不起作用?

谢谢

0 个答案:

没有答案