有没有办法在浏览器中使用具有特定名称的ASP.NET MVC FileContentResult来流式传输文件?
我注意到你可以有一个FileDialog(打开/保存),或者你可以在浏览器窗口中流式传输文件,但是当你尝试保存文件时它会使用ActionName.
我有以下场景:
byte[] contents = DocumentServiceInstance.CreateDocument(orderId, EPrintTypes.Quote);
result = File(contents, "application/pdf", String.Format("Quote{0}.pdf", orderId));
Run Code Online (Sandbox Code Playgroud)
当我使用它时,我可以流式传输字节,但是给用户提供了一个OPEN/SAVE文件对话框.我想在浏览器窗口中实际传输此文件.
如果我只使用FilePathResult,它会在浏览器窗口中显示该文件,但是当我单击"保存"按钮将文件保存为PDF时,它会显示操作名称作为文件的名称.
有没有遇到过这个?
我有一个控制器操作,根据容器引用名称(即blob中文件的完整路径名称)从azure blob下载文件.代码看起来像这样:
public FileContentResult GetDocument(String pathName)
{
try
{
Byte[] buffer = BlobStorage.DownloadFile(pathName);
FileContentResult result = new FileContentResult(buffer, "PDF");
String[] folders = pathName.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries);
// get the last one as actual "file name" based on some convention
result.FileDownloadName = folders[folders.Length - 1];
return result;
}
catch (Exception ex)
{
// log error
}
// how to handle if file is not found?
return new FileContentResult(new byte[] { }, "PDF");
}
Run Code Online (Sandbox Code Playgroud)
该BlobStorage班有我的助手类,以从团块下载流.
我的问题在代码注释中说明:当找不到文件/流时,我应该如何处理场景?目前,我传递的是一个空的PDF文件,我觉得这不是最好的方法.
我有一个System.Drawing.Image类型的对象,并希望在视图中显示此图像.最好的方法是什么?
我找到了一些可能适合这种情况的自定义Html Helper方法.还找到了一个使用新动作方法的示例,该方法返回一个FileContentResult以便拉出这样的东西.我想知道哪种技术最好,最容易实现.
编辑
更具体地说,我在Controller中的System.Drawing.Image变量中有图像,我希望在视图中显示该变量.
我有一个显示 pdf 的操作
public ActionResult MyPdf()
{
var response = pdfService.MyPdf(new PdfRequest() { SiteId = siteSession.ActiveSiteId });
return File(response.Pdf, "application/pdf");
}
Run Code Online (Sandbox Code Playgroud)
该服务打开 PDF,使用数据库中的数据填写表单,然后传回容器类。 response.Pdf是一个byte[].
我想要做的是设置打开 PDF 时浏览器使用的页面标题。目前,File(response.Pdf, "application/pdf");将允许我的浏览器(chrome)显示pdf。
如果我将其更改为File(response.Pdf, "application/pdf", "My PDF File Name");,则不会显示 pdf,但会自动下载。
我的操作没有定义视图。如何在浏览器中显示 PDF,而不强制下载并通过操作方法设置页面标题?
所以我FileContentResult从这样的动作返回一个:
return File(pck.GetAsByteArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "MyExcelFile.xlsx");
Run Code Online (Sandbox Code Playgroud)
在IE中单击"打开"(我使用的是IE9,版本9.0.8112.16421)时,会显示"无法下载文件",并向用户显示"重试"按钮.如果他们单击"重试",则可以正常工作.如果他们单击"保存",则工作正常.在Firefox中,它工作正常.
如何在第一次单击"打开"时允许用户打开文件?
我的一个控制器操作将文件返回给用户.无论文件类型如何,我都希望向用户显示下载(打开/保存)对话框.当文件类型为.doc,.docx,.xlsx等时,这可以正常工作,但是当文件是.txt,.xps,.pdf(有时)或.html时,它会在浏览器中打开.
有没有办法阻止文件在浏览器中打开,只允许用户在单独的窗口中打开它而不导航离开当前页面?
该文件的请求是使用jQuery的$.ajax({}).
相关阅读:具有浏览器处理该请求,并给予弹出,而不是AJAX调用接收文件的conent作为响应字符串被解释这个ansewr,但这个问题地址迫使浏览器处理文件以某种方式一次收到了.
我为用户编写了一个动作,用于下载生成的xml,而不必将其写入服务器磁盘,但将其保存到内存中.
这是我的代码:
public FileContentResult MyAction()
{
MemoryStream myStream = new MemoryStream();
XDocument xml = GenerateXml(...);
xml.Save(myStream );
myStream .Position = 0;
return File(myStream.GetBuffer(), "text/xml", "myFile.xml");
}
Run Code Online (Sandbox Code Playgroud)
一切似乎工作正常,XML是正确的,我可以下载文件,但我不明白为什么我的文件末尾有691920"nul"caracters(这些caracters的数量似乎与长度有关)的xml):

它们来自哪里?我怎么能摆脱它们?
[更新]我试过这个:
public FileContentResult MyAction()
{
XDocument xml = GenerateXml(...);
byte[] bytes = new byte[xml.ToString().Length * sizeof(char)];
Buffer.BlockCopy(xml.ToString().ToCharArray(), 0, bytes, 0, bytes.Length);
return File(bytes, "text/xml", "myFile.xml");
}
Run Code Online (Sandbox Code Playgroud)
我没有得到"nul"角色.所以我想这是MemoryStream在文件末尾添加额外的caracters.所以在我的例子中,第二个代码解决了我的问题.
但我也生成了一个我无法阅读的Word文档(由于内容存在问题,因此无法打开xxx.docx).我想我在这里遇到同样的问题,内存流在文件末尾添加额外的caracters并破坏它.
我正在从MVC 3网站生成CSV并使用FileContentResult将其传递给用户.这很好用但是生成csv需要30秒,因此在向用户提供保存提示之前30秒.
public virtual FileContentResult GetSpreadsheet(string id)
{
var service = new SpreadsheetService();
var result = service.GetCSV();
return File(new System.Text.UTF8Encoding().GetBytes(result.Message), "text/csv", "Report123.csv");
}
Run Code Online (Sandbox Code Playgroud)
所以我以为我只是通过JQuery调用它 - 但这(不出所料!)只是将CSV转储到页面.
$.post("/Home/GetSpreadsheet/" + id, null, function (data) {
$('#resultDiv').html(data);
});
Run Code Online (Sandbox Code Playgroud)
有谁知道我现在如何生成保存提示我已经有数据了?谢谢
model-view-controller jquery filecontentresult asp.net-mvc-3
我目前正在尝试将存储在数据库中的图像视为BLOB,为此,我创建了一个FileContentResult类型的Controller Action,如下所示:
public FileContentResult ImageFile(string imageId)
{
var client = new WcfTestClient();
DataTable table = client.GetImageData(imageId);
var image = ConvertToBytes(table);
byte[] bytes;
bytes = image[0].Values.ElementAt(0);
return File(bytes, @"image/png");
}
Run Code Online (Sandbox Code Playgroud)
它从数据库中获取正确的图像数据,ConvertToBytes()也正常工作但由于某种原因,在将图像返回到View后,它会跳回到顶部并再次运行.
我正在使用Ajax从我的View中调用方法,如下所示:
$.ajax({
url: "/Home/ImageFile",
type: "GET",
data: { "imageId": imageId },
success: function (data) {
var image = document.createElement('img');
image.src = "/Home/ImageFile?id=" + imageId;
image.width = 100;
image.height = 100;
div.appendChild(image);
}
});
Run Code Online (Sandbox Code Playgroud)
有谁知道什么可能导致我的问题?
更新
好的,所以现在在被告知是Ajax搞砸了之后我试图向我的Controller Action发送一个参数,如下所示:
var images = JSON.parse(window.localStorage.getItem("JsonImages"));
var div = document.getElementById('imgOutput');
for (var i = 0; …Run Code Online (Sandbox Code Playgroud) 在我看来,我有一个图像,如:
<img width="150" height="150" scr="@Url.Action("GetImage", "Item")" />
Run Code Online (Sandbox Code Playgroud)
我的控制器ItemController有这个方法:
public FileContentResult GetImage(){
var model = _itemService.GetItemImage(1);
if(model != null && model.ImageData != null){
return File(model.ImageData, model.ImageMimeType);
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
当视图呈现时,我得到了我的图像的以下标记,但没有渲染图像:
<img width="150" height="150" scr="/MyApp/ItemManagement/GetImage"/>
Run Code Online (Sandbox Code Playgroud)
如果我在浏览器中输入此URL"http:// localhost/MyApp/ItemManagement/GetImage",我会得到图像.我不确定这有什么问题.有人可以指出我的代码有什么问题吗?
提前致谢.杰夫
我有一个MVC 5应用程序,允许用户下载数据库中存储的文件。我正在使用FileContentResult操作方法来执行此操作。
我可以在整个应用程序中限制对该方法的访问,但是精明的用户可以找出操作URL并将类似这样的内容(localhost:50000 / Home / FileDownload?id = 13)粘贴到他们的浏览器中,并可以通过以下方式下载任何文件只是更改参数。
我想限制用户这样做。仅允许管理员角色和具有特定权限的用户,这些权限只能由数据库调用来确定是否下载文件。
我正在寻找的是,如果用户使用URL下载文件并且没有适当的权限,我想用消息重定向用户。
我想做类似下面的代码或类似的操作,但是出现以下错误:无法将类型'System.Web.Mvc.RedirectToRouteResult'隐式转换为'System.Web.Mvc.FileContentResult'
我知道我不能在这里使用return RedirectToAction(“ Index”),只是在寻找有关如何解决此问题的想法。
public FileContentResult FileDownload(int id)
{
//Check user has file download permission
bool UserHasPermission = Convert.ToInt32(context.CheckUserHasFileDownloadPermission(id)) == 0 ? false : true;
if (User.IsInRole("Administrator") || UserHasPermission)
{
//declare byte array to get file content from database and string to store file name
byte[] fileData;
string fileName;
//create object of LINQ to SQL class
//using LINQ expression to get record from database for given id value
var …Run Code Online (Sandbox Code Playgroud) 我有一个从字节数组中获取的FileContentResult,并希望将其转换为FileStreamResult.这可能吗?如果是这样,怎么样?
我在从数据库获取的控制器中执行相同的操作,例如具有姓名、年龄、图像(字节 [])的员工。
所以我将信息存储在 ViewBag 中。然后在查看图像的具体代码是:
<img src="@ViewBag.Image" alt="Logo" />
Run Code Online (Sandbox Code Playgroud)
但是当我看到回复的内容时,我有:
<img src="System.something.FileContentResult" alt="Logo" />
Run Code Online (Sandbox Code Playgroud)
我见过很多从控制器中的特定操作获取 FileContentResult 的示例,例如:
(代码仅为示例)
public ActionResult GetEmployeeImage (int id){
byte[] byteArray = GetImageFromDB(id);
FileContentData file = new File (byteArray,"image/jpg");
return file;
}
Run Code Online (Sandbox Code Playgroud)
然后渲染图像:
<img src="@Url.Action("GetEmployeeImage", "Home", new { id = ViewBag.Id })" alt="Em" />
Run Code Online (Sandbox Code Playgroud)
但我不想要那个,因为我已经有了图像。
如何将其渲染到视图抛出 ViewBag?
谢谢!
PD:在视图中渲染图像是相同的,但尚未结束
asp.net-mvc ×5
c# ×4
jquery ×3
ajax ×2
asp.net ×1
fileresult ×1
html-helper ×1
image ×1
linq-to-xml ×1
memorystream ×1
page-title ×1
pdf ×1
view ×1