2015-07-21 2 views
1

Этот вопрос относится к одному Я спросил here: «Как я могу пригласить пользователя для сохранения местоположения на странице Sharepoint?»Как я могу сделать файл, сгенерированный на веб-странице, доступным для пользователя в качестве загрузки?

Что мне нужно сделать, это, после генерации PDF, таким образом:

 private void GeneratePDF(List<ListColumns> listOfListItems) 
     { 
      . . . 
      //Create a stream that we can write to, in this case a MemoryStream 
      StringBuilder sb = new StringBuilder(); 
      using (var ms = new MemoryStream()) 
      { 
       using (var doc = new Document(PageSize.A4, 25, 25, 10, 10)) 
       { 
        //Create a writer that's bound to our PDF abstraction and our stream 
        using (var writer = PdfWriter.GetInstance(doc, ms)) 
        { 

         //Open the document for writing 
         doc.Open(); 

         Paragraph docTitle = new Paragraph("UCSC - Direct Payment Form", timesBold16UCSCBlue); 
         doc.Add(docTitle); 

         Paragraph subTitle = new Paragraph("(Not to be used for reimbursement of services)", timesRoman9Font); 
         subTitle.IndentationLeft = 20; 
         doc.Add(subTitle); 

         . . . // tons of iTextSharp PDF-generation code elided for brevity 

         String htmlToRenderAsPDF = sb.ToString(); 

         //XMLWorker also reads from a TextReader and not directly from a string 
         using (var srHtml = new StringReader(htmlToRenderAsPDF)) 
         { 
          XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, srHtml); 
         } 

         doc.Close(); 
        } 
       } 
       try 
       { 
        var bytes = ms.ToArray(); 
        // This is currently saved to a location on the server such as C:\Users\TEMP.SP.005\Desktop\iTextSharpTest.pdf (but the number (such as 
"005" irregularly increments)) 
        String pdfFileID = GetYYYYMMDDAndUserNameAndAmount(); 
        String pdfFileName = String.Format("DirectPayDynamic_{0}.pdf", pdfFileID); 
        String fileFullpath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), pdfFileName); 
        String fileLinkBase = "Generated PDF: <a href=\"{0}\">{1}</a>"; 
        String filelink = String.Format(fileLinkBase, fileFullpath, pdfFileName); 
        File.WriteAllBytes(fileFullpath, bytes); 

        var pdflink = new Label 
        { 
         CssClass = "finaff-webform-field-label", 
         Text = filelink 
        }; 
        this.Controls.Add(pdflink); 
       } 
       catch (DocumentException dex) 
       { 
        throw (dex); 
       } 
       catch (IOException ioex) 
       { 
        throw (ioex); 
       } 
       catch (Exception ex) 
       { 
        throw (ex); 
       } 
      } 
     } // GeneratePDF 

... предоставить пользователю возможность сохранить файл на локальном компьютере (в настоящее время она сохраняется на сервере).

IOW, что я в принципе хочу сделать, это заменить эту строку:

String fileFullpath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), pdfFileName); 

... что-то вроде:

String fileFullpath = "Hey, bloke (or blokette), where do you want to save this?" 

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

Возможно, что решение на стороне сервера (C#) или на стороне клиента (jQuery) приемлемо, хотя я предпочитаю серверную сторону, так как там создается PDF-файл.

+1

Избавьтесь от 'catch'. – SLaks

+2

Ваш сервер не может записать на диск пользователя. Вместо этого вам нужно передать файл по HTTP-ответу в виде загрузки. – SLaks

+0

Почему? (избавиться от моих блоков catch) –

ответ

1

Когда я должен был заставить электронную таблицу Excel для загрузки клиента, я использовал этот код, который может направить вас туда, где вы хотели получить:

Control xxx of type 'LinkButton' must be placed inside a form tag with runat=server

protected void ExportExcelFile(object Sender, EventArgs e) { //export to excel 
     var grdResults = new DataGrid(); // REF: https://stackoverflow.com/q/28155089/153923 
     if (periodCriteria.SelectedValue == "year") { 
      grdResults = RollupDG; 
     } else { 
      grdResults = QuarterDG; 
     } 
     var response = HttpContext.Current.Response; 
     response.Clear(); 
     response.Charset = String.Empty; 
     response.ContentType = "application/vnd.ms-excel"; 
     response.AddHeader("Content-Disposition", "attachment; filename=GlBudgetReport.xls"); 
     using (var sw = new StringWriter()) { 
      using (var htw = new HtmlTextWriter(sw)) { 
       grdResults.RenderControl(htw); 
       response.Write(sw.ToString()); 
       response.End(); 
      } 
     } 
}