2015-07-21 50 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(); 
      } 
     } 
} 
相关问题