Я использовал метод UploadFileAsync
для завершения загрузки файла на удаленный сервер до тех пор, пока он не обнаружит файл размером около 1 ГБ, где ОЗУ будет стремительно увеличиваться в размере файла и вылетает приложение.
Небольшое исследованиедолжен привести меня к функции 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, какую переменную я передаю как Data ?
Кроме того, какой обработчик требуется для функции openwriteasync
для отслеживания текущего прогресса, этот метод также вызывает событие 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, который действительно кажется одним деломs не существует!
Частная общая функция InlineAssignHelper (Of T) (цель ByRef как T, значение ByVal как T) Как цель T = значение Возвращаемое значение Конечная функция Private Sub PushData (вход ByVal как поток, выход ByValAs Stream) DIM-буфер As Byte () = Новый байт (4095) {} Dim bytesRead As Integer
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
Однако, учитывая ваши комментарии, я пришел к выводу, что он пишет, но при поискепри исходящем трафике не происходит загрузка или ответ от сервера, пока он не остановится или не завершится с ошибкой памяти, есть идеи, почему это не работает?
Спасибо