Как я могу загрузить файл (большого размера), используя FileStream в WebService в IIS (Internt Information Services)

#c# #web-services #iis #upload #filestream

#c# #веб-сервисы #iis #загрузка #filestream

Вопрос:

Я использую C # для создания сервиса для загрузки файлов. Я создал три метода:

  • upload_start(string filename)
  • upload_continue(string filename, byte[] buffer)
  • upload_end(string filename)
  • Это работает, но я не хочу обрабатывать 3 функции из клиентской программы. Как я могу открыть FileStream из клиентской программы и позволить стороне сервера завершить загрузку файла?

    Комментарии:

    1. Вы хотите, чтобы файл был загружен с клиента, тогда сервер может начать чтение файла с клиентского компьютера? Я пытаюсь получить разъяснения по поводу того, что вы пытаетесь сделать.

    2. Да, я хочу, чтобы сервер позаботился обо всем.

    Ответ №1:

    Вероятно, самым простым подходом было бы создать службу REST либо с помощью wcf, либо сделать что-то подобное с asp.net , но тогда вы бы просто выполнили POST операцию, и сервер мог бы выполнить эту работу.

    Вот один из подходов:

    http://debugmode.net/2011/05/01/uploading-file-to-server-from-asp-net-client-using-wcf-rest-service/

    У этого был бы более простой интерфейс для вас.

    Ответ №2:

    Я не думаю, что вы можете, поскольку FileStream не сериализуем. Почему бы не передать службе имя файла (как вы уже используете) и попросить службу открыть файл и обработать его.

    Комментарии:

    1. но, похоже, я могу просто запросить.getInputStream для чтения всего загружаемого файла. <br> Я не могу открыть файл по имени файла со стороны сервера веб-службы, поскольку файл находится на стороне клиента.

    2. @alex — Сервер не будет иметь доступа к файловой системе на клиенте, поскольку это было бы невероятно большой дырой в безопасности, которую другие хотели бы использовать.

    Ответ №3:

    Для загрузки большого файла в веб-сервисах (не Windows Cominication Foundation WCF) это способ следовать:

    В файле Web.Config на стороне сервера добавьте этот xml и измените значение maxRequestLength в зависимости от максимального размера загрузки, по умолчанию maxRequestLength равен 4 МБ, в этом примере 8192 = МБ

         <httpRuntime
            executionTimeout="600"
            maxRequestLength="8192"
            useFullyQualifiedRedirectUrl="false"
            minFreeThreads="8"
            minLocalRequestFreeThreads="4"
            appRequestQueueLimit="100"
            enableVersionHeader="true"
      />
      

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

      public String UploadFile(byte[] fileByte, String fileName, String savePath)
            {
    
                string newPath = savePath;
    
    
                if (!Directory.Exists(newPath))
                {
                    Directory.CreateDirectory(newPath);
                }
    
                newPath = newPath   fileName;
    
                System.IO.FileStream fs1 = null;
                byte[] b1 = null;
                b1 = fileByte;
                fs1 = new FileStream(newPath, FileMode.Create);
                fs1.Write(b1, 0, b1.Length);
                fs1.Flush();
                fs1.Close();
                fs1 = null;
    
                return newPath;
            }
      

    На стороне клиента добавьте этот код для отправки файла:

     Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
                dlg.FileName = "Select a File"; 
                dlg.DefaultExt = ".xls";  
                dlg.Filter = "Excel documents (.xls)|*.xls";  
    
                // Show open file dialog box 
                Nullable<bool> result = dlg.ShowDialog();
    
                // Process open file dialog box results 
                if (result == true)
                {
    
                    string filename = dlg.FileName;
    
    
                    string file = Path.GetFileName(filename);
    
                    System.IO.FileStream fs1 = null;
                    fs1 = System.IO.File.Open(filename, FileMode.Open, FileAccess.Read);
                    byte[] b1 = new byte[fs1.Length];
                    fs1.Read(b1, 0, (int)fs1.Length);
                    fs1.Close();
    
    
                    String savePath = @"C:DOCIMPORT";
                    String newPath = WEB_SERVICES.UploadFile(b1, file, savePath);
    
    
                    MessageBox.Show(String.Format("The file is uploaded in {0}", newPath));
    
    
                }
                else
                {
                    MessageBox.Show("Select a file, please");
                }