Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从操作返回图像会导致FireBug/Chrome开发工具出错_C#_Asp.net Mvc_Asp.net Mvc 3 - Fatal编程技术网

C# 从操作返回图像会导致FireBug/Chrome开发工具出错

C# 从操作返回图像会导致FireBug/Chrome开发工具出错,c#,asp.net-mvc,asp.net-mvc-3,C#,Asp.net Mvc,Asp.net Mvc 3,我有一个简单的表单,可以将图像上传到数据库。使用控制器操作,图像可以返回(我已经硬编码使用JPEG编码): 此外,我想我应该提到,我正在IIS Express上运行此功能(甚至在Cassini上进行了测试,得到了相同的结果) 奇怪的是,图像显示正确,但控制台告诉我不是这样。理想情况下,我不想忽略这些错误。最后,为了进一步增加混淆,当作为图像引用时(例如,),不会发生错误 编辑:无需执行任何上述操作,即可完全复制此操作: public class ImageController : Control

我有一个简单的表单,可以将图像上传到数据库。使用控制器操作,图像可以返回(我已经硬编码使用JPEG编码):

此外,我想我应该提到,我正在IIS Express上运行此功能(甚至在Cassini上进行了测试,得到了相同的结果)

奇怪的是,图像显示正确,但控制台告诉我不是这样。理想情况下,我不想忽略这些错误。最后,为了进一步增加混淆,当作为图像引用时(例如,
),不会发生错误

编辑:无需执行任何上述操作,即可完全复制此操作:

public class ImageController : Controller
{
    public FileResult Test()
    {
        // I know this is directly reading from a file, but the whole purpose is
        // to return a *buffer* of a file and not the *path* to the file.
        // This will throw the error in FireBug.
        var buffer = System.IO.File.ReadAllBytes("PATH_TO_JPEG");
        return this.File(buffer, "image/jpeg");
    }
}

可能是session.Save/Get正在截断jpeg吗?

使用Fiddler并将此文件保存到服务器上。尝试直接向映像发送GET请求。然后尝试获取操作方法。比较fiddler的标题和内容(可以保存并与BeyondCompare进行比较)。如果两个get请求都匹配,那么。。这是没有道理的——在这种情况下会有所不同,希望能指出问题所在。有些东西必须是不同的-但是如果没有看到小提琴手的输出,很难说:)

可能是图像本身损坏了吗?如果您将其保存为网站上的文件并直接访问,是否会出现错误?与你在Fiddler中的动作请求相比,这个请求看起来怎么样?可能是浏览器正在尝试通过扩展获取内容类型,您可以尝试以下方式查看是否有任何更改:

routes.MapRoute(
    "JpegImages",
    "Images/View/{id}.jpg",
    new { controller = "Images", action = "View" }
);
还有一件事要检查。image.InputStream.Read()返回一个整数,该整数是实际读取的字节数。可能是所有的字节都不能一次读取,如果数字不匹配,你能记录下来并抛出一个错误吗

int bytesRead = image.InputStream.Read(message.ImageData, 0, image.ContentLength);
if (bytesRead != image.ContentLength)
    throw new Exception("Invalid length");

您假设MIME类型始终为image/jpeg,并且您没有使用上载图像的MIME类型。我见过不同浏览器为上传的图像发布的MIME类型:

  • 图像/gif
  • 图像/jpeg
  • 图像/pjpeg
  • 图像/png
  • 图像/x-png
  • 图像/bmp
  • 图像/tiff

可能image/jpeg不是文件的正确MIME类型,开发工具会给您一个警告。

我想知道这是否与X-SourceFile有关。我正在用MVC做与您完全相同的事情,但我要在数据库中持久化我的字节数组。在我们的标题中,我不理解的唯一区别是X-SourceFiles

下面是一些关于X-SourceFiles所做的事情,并讨论了编码。那么也许??回答者声称这只发生在你的本地主机上


据我所知,如果您返回的是一个正确的字节数组,即jpeg,那么您的代码应该可以正常工作。这正是我成功做到的(没有X-SourceFiles头)。

感谢大家的帮助。我知道这将是一个非常反气候的结局,但我能够“解决”这个问题。我尝试使用相同的浏览器/firebug版本从另一台机器构建代码。奇怪的是,没有出现错误。当我回到另一台机器(清除所有缓存,甚至重新安装浏览器/firebug)时,它仍然收到错误。更奇怪的是,当我访问其他网站时,Chrome/Firefox都显示了错误


再次感谢大家的建议

没有,因为我已经将输入和输出都写入了两个单独的文件,并与hex editor进行了比较,它们是相同的。数据没有被截断。是的,我正打算让Fiddler试试——我会这么做,然后让你知道@亚当-正如所怀疑的,答案是相同的(除了日期-显然)。但是,如果
请求具有
接受:image/png,image/*;q=0.8,*/*;q=0.5
而直接操作方法有
Accept:text/html、application/xhtml+xml、application/xml;q=0.9,*/*;q=0.8
。您可以通过以下链接查看:。我认为请求内容类型不重要吗?这真是让我难以置信。对于咯咯笑,你能设置你的路线,让action.gif请求进入你的控制器吗?我很好奇,当它查看扩展时,是否只是一个firebug bug,并期望上面的accept头反过来得到一个gif。@Adam-谢谢你的想法-但这也不起作用。这真是令人沮丧…当你尝试这样做时发生了什么?请求成功吗?哪些标题成功?只要内容类型是正确的,图像字节确实是正确的,您就可以按照http规范进行操作,并且可以看出firebug的缺陷。我将尝试复制。请参阅评论中我与Adam的讨论。我上传了标题进行分析。如果直接访问文件而不是通过操作访问文件,我看不出你提到的内容有什么不同。如果不是,则文件很可能已损坏,可能是由流造成的。如果它们不同,请尝试我建议的路径,看看是否有不同。文件没有损坏,请参阅OP中的“我的编辑”。我已经测试了映射到
images/view/{id}.jpg的操作,请再次检查注释。我还试着在
标签中放置一些有用的东西。但是直接访问图像是我想要的。试试我上面发布的动作。谢谢你的想法-但事实并非如此,因为我尝试了其他网站的JPEG和我自己创建的JPEG/PNG。嗯,读完这些,可能就是它了!我将尝试部署到非本地IIS,并让您知道它是如何运行的:)。您是否分析FireBug错误中的base64图像数据?知道这些数据是否与您的文件内容相同会很有帮助。@Marten-这是一个很好的观点,我今天晚些时候有机会会尝试一下!
routes.MapRoute(
    "JpegImages",
    "Images/View/{id}.jpg",
    new { controller = "Images", action = "View" }
);
int bytesRead = image.InputStream.Read(message.ImageData, 0, image.ContentLength);
if (bytesRead != image.ContentLength)
    throw new Exception("Invalid length");