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