2013-11-19 2 views
0

Возможно, вопрос звучит как уже ответивший и googleable, но мне не удалось найти ответ.Загрузить толкаемый файл с помощью JavaScript

У меня есть WebApi, установленный как служба Windows с поддержкой SignalR. После некоторых операций, я пытаюсь нажать * .zip для клиентов:

using (var zip = new ZipFile()) 
{ 
    zip.AddDirectory(mydir); 
    Clients.All.pushFile(zip,"application/zip, application/octet-stream",myname); 
} 

У меня есть несколько клиентов: C# WinForms приложений и HTML страницы с помощью JavaScript. я пытался справиться с этим методом, используя FileSaver.js, но мне кажется, что он не поддерживает почтовый индекс или я делаю что-то неправильно:

pushFile: function (result, type, name) { 
      try { 
       var blob = new Blob(result, type); 
       saveAs(blob, name); 
      } catch(e) { 
       alert(e); 
      } 
     } 

Таким образом, вопрос - как справиться с моей SignalR файла толчок с клиентом JavaScript ? Я хотел бы иметь диалог сохранения файла. Если на этот вопрос уже дан ответ, пожалуйста, поделитесь ссылкой и примите мои извинения за дубликаты! Спасибо!

+0

'pushFile' вызывается в js? можете ли вы проверить Firebug, что он получает? – Rudy

+0

Да, это так. Я получаю объект. http://prntscr.com/257lhv –

ответ

0

Возможно, это не поможет, но надеюсь, что это может дать вам некоторое представление о том, как решить вашу проблему.

using (var zip = new ZipFile()) 
    { 
     var mStream = new MemoryStream(); 
     byte[] fileData = ;//get file data here 
     string fileName = ; // get file name here 
     var memoryStream = new MemoryStream(fileData); 
     memoryStream.Seek(0, SeekOrigin.Begin); 
     zip.AddEntry(fileName, memoryStream); 
     mStream.Seek(0, SeekOrigin.Begin); 
     zip.AddDirectory(mydir); 
     zip.Save(mStream); 
     mStream.Position = 0; 

     Clients.All.pushFile(mStream,"application/zip, application/octet-stream"); 
    } 
+0

Спасибо! Запись файла в поток и передача его в FileSaver сделала трюк, теперь он работает! –

0

Это временное решение, пока не выясню, почему filesaver.js не работает: Я считаю, что вы используете этот ZipFile: http://dotnetzip.herobo.com/DNZHelp/html/8b981f77-742a-5f47-6299-c27104871d8c.htm

В C#:

 //SignalR 
     string zipName = "myZip" 
     Clients.All.pushFileNotification("Download.aspx?myZip=" + zipName); 

    //Download.aspx 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!string.IsNullOrWhiteSpace(Request["myZip"])) 
     { 
      download(Request["myZip"]); 
     } 
    } 

    private void download(string myZip) 
    { 
     Response.Clear(); 
     if (myZip == "myZip") // some validation if you want 
     {     
      using (MemoryStream output = new MemoryStream()) 
      { 
       using (var zip = new ZipFile()) 
       { 
        zip.AddDirectory(mydir); 
        if (Response.IsClientConnected) 
        { 
         Response.ClearHeaders(); 
         Response.ClearContent(); 
         zip.Save(output); 
         byte[] buffer = output.ToArray(); 
         Response.AppendHeader("Content-Length", buffer.Length.ToString()); 
         Response.ContentType = "application/octet-stream"; 
         Response.AppendHeader("Content-Disposition", "attachment; filename=" + myZip); 


         if (buffer.Length < 1) 
         { 
          return; 
         } 
         if (Response.IsClientConnected) 
         { 
          Response.BinaryWrite(buffer); 
         } 
        } 
       } 
      } 
     } 

     Response.End(); 
    } 

В HTML добавить IFRAME:

<iframe id="zipLoader" src="#" width="0" height="0" tabindex="-1" title="empty" hidden style="display: none;"> 
</iframe> 

и в ЯШ:

pushFileNotification: function (result) { 
     try { 
      $('#zipLoader').attr('src', result); 
     } catch(e) { 
      alert(e); 
     } 
    } 

Это некрасиво, но оно должно работать. Лучше всего было бы, если бы это сработало, как вы его написали. Я использую jQuery, но вы можете понять, что здесь происходит, и вы можете заменить его на простые js.

+0

В моем zip-файле нет пути на сервере, он создается динамически. –

+0

тем не менее, есть метод, который записывает его в ответ – Rudy

+0

Не могли бы вы дать подсказку, или лучше - пример для моего дела? Как написать файл для ответа? –

Смежные вопросы