koriewhite Ответов: 1

Как я могу использовать одно соединение для загрузки нескольких файлов в VB.NET


у меня есть это приложение, которое читает несколько файлов из папки и загружает их в server..it работает нормально, но когда он хочет загрузить каждый файл, он создает соединение, загружает файл и закрывает соединение. он делает то же самое для всех файлов снова и снова. мне нужна ситуация, когда он создает только одно соединение, загружает все файлы и закрывает соединение. пожалуйста, любая помощь будет оценена по достоинству, я искал везде, но не смог найти никакой помощи. ниже приведен мой код


Imports System.IO
Imports System.Net

Public Class DemoFTPServerApp

Dim _Filename As String
Dim _UploadPath As String
Dim f As String


Public Sub LoadFiles(_User As String, _Password As String, _Path As String)
    Dim _MyArraylist As New ArrayList
    Dim FolderPath As String = "C:\Users\Desktop\files"



    Dim finfo As New DirectoryInfo(FolderPath)
    For Each fi In finfo.GetFiles("*.txt")
        _MyArraylist.Add(fi.FullName) 'full path only
        _Filename = fi.FullName
        f = fi.ToString()
        _UploadPath = _Path & f


       Try
      Dim request As FtpWebRequest = DirectCast(WebRequest.Create(New Uri(_UploadPath)), FtpWebRequest)
            request.Method = WebRequestMethods.Ftp.UploadFile
            request.Credentials = New NetworkCredential(_User, _Password)
            request.UseBinary = True
            request.UsePassive = False
            request.KeepAlive = True
            request.ConnectionGroupName = "company name"
            request.ServicePoint.ConnectionLimit = 4
            request.ServicePoint.CloseConnectionGroup("company name")


            Dim buffer(1023) As Byte
            Dim bytesIn As Long = 1

            Dim filepath As System.IO.FileInfo = New System.IO.FileInfo(_Filename)
            Dim _FileStream As System.IO.FileStream = filepath.OpenRead()
            Dim _Stream As System.IO.Stream = request.GetRequestStream


            Do Until bytesIn < 1
                bytesIn = _FileStream.Read(buffer, 0, 1024)
                If bytesIn > 0 Then
                    _Stream.Write(buffer, 0, bytesIn)

                End If
            Loop

            _Stream.Close()
            _Stream.Dispose()
            _FileStream.Close()
            _FileStream.Dispose()
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    Next

    MessageBox.Show("File Succesfully uploaded!")

End Sub

Private Sub btnUploadFile_Click(sender As Object, e As EventArgs) Handles btnUploadFile.Click

   LoadFiles("username", "password", "ftp://ftpsite.com/")

End Sub


Что я уже пробовал:

Этот код работает нормально, но мне нужна небольшая помощь в том, как его изменить.
я попытался вывести FTP-соединение из цикла, но оно выдает ошибку ArgumentNullException, которую я ожидал.

1 Ответов

Рейтинг:
0

Sergey Alexandrovich Kryukov

Прежде чем рассматривать какие-либо специализированные элементы управления, рассмотрите простейшую возможность: веб-форму и multiple атрибут input управление типа "файл". Пожалуйста, смотрите:
Использование файлов из веб-приложений.
Вот как это может выглядеть:

<form action="someScript.asp">
  <!-- ... -->
  Select images: <input type="file" name="fileSet" multiple="true">
  <input type="submit">
</form>

Такая форма отправит HTTP-запрос на серверную сторону; со всеми введенными файлами. Реальный эффект атрибута multiple заключается в том, что диалоговое окно файла будет отображаться в режиме множественного выбора, так что пользователь может выбрать более одного файла. Все данные файла будут отправлены в HTTP-запросе на серверную сторону, где вы сможете их обработать.
Смотреть также:
Руководство по HTML-формам — руководства для веб-разработчиков,
< форма> — - HTML.

—СА


koriewhite

Спасибо СА за Ваш вклад.. жаль, что мое приложение является приложением Windows, а не веб-приложения

Sergey Alexandrovich Kryukov

И затем... о, тогда это вообще не проблема.

Вы можете использовать обычный диалог открытия файла и позволить пользователю выбрать любое количество файлов. Затем вы можете составить один HTTP-запрос ("post") и записать все данные, которые вам нужно передать. Адекватным классом для этой деятельности является System.Net.HttpWebRequest:
https://msdn.microsoft.com/en-us/library/system.net.httpwebrequest%28v=vs.110%29.aspx.

И ваша серверная сторона должна быть готова к приему нескольких файлов. Если вы говорите, что ваше приложение не является веб-приложением, это может означать, что у вас все еще есть какое-то веб-приложение/сайт, но это не ваше, поэтому вы не можете его изменить. Если это так, то вы все равно можете делать только то, что ожидает это веб-приложение. Если он может принимать несколько файлов в одном посте, вы можете сделать такой пост. Это все.

Теперь вы примете мой ответ официально?

—СА

koriewhite

Спасибо.. у меня есть еще одно приложение, которое использует диалоговое окно открытия файла для выбора файлов, и оно отлично работает, но это приложение читает файлы из папки без какого-либо взаимодействия с графическим интерфейсом для выбора файлов.
спасибо, но это не поможет мне решить мою проблему.

Sergey Alexandrovich Kryukov

А почему бы и нет? Как проблемы с сайтом и подключением связаны с вашим другим приложением? Загружайте все, что хотите; я упомянул диалог только для иллюстрации, как аналогию с поведением браузера.

Это все, что вам действительно нужно (Мой комментарий выше), но это зависит от того, что у вас есть на стороне сервера сайта.
Мой совет либо решит вашу проблему, либо она может оказаться неразрешимой без изменения кода сайта...

—СА