异步下载文件到客户端

2024-04-24

我很难完成某件事。

我正在使用 asp.net MVC 4 构建邮件客户端。

我现在必须将与消息(而不是附件)相关的图像下载到客户端浏览器。

现在我有这个设置:

客户端浏览器->控制器/后端->邮件服务器

澄清一下:我有一个客户端请求,其中包含图像的内容 ID、正确的邮箱、消息等。有了这些信息,我可以从邮件服务器下载图像并将其上传到客户端。 现在最困难的部分来了:我想异步执行此操作。我希望能够从邮件服务器下载 512 KB 的块,解码该部分,然后将其发送到客户端.. 获取 - 解码 - 发送.. 只要浏览器获得图像的所有数据即可。

我只是不想首先将所有数据下载到服务器,然后使用所有数据创建一个新的内存流并将其作为文件结果返回。我只是太害怕内存中的文件太大并阻止其他进程等。

我也计划使用这种方法来上传真实的附件(可能是数百MB)。所以我稍后会需要这个方法。

现在我只是不知道如何实现这一点,因为我有一个到邮件服务器的连接,并且我有一个到客户端的连接。我必须将数据传递到新流或其他东西才能完成此任务。

有人可以帮帮我吗?

编辑:澄清一下:不,我无法引用邮件服务器上的文件。我必须通过套接字将文件下载到服务器。

Edit2:http chunked 可以作为解决方案吗?如果是的话,你能给我一个小例子吗?


您只需要将数据从一个流(到邮件服务器的 tcp 连接)复制到另一个流(到浏览器的 http 连接),对吗?如果你想扩展,你需要使用非阻塞 IO,如本文 http://msdn.microsoft.com/en-us/magazine/cc337900.aspx。因此,您需要从 IHttpAsyncHandler 实现调用该文章中的代码。你最终会得到这样的结果:

class MyHandler : IHttpAsyncHandler
{
    public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
    {
        Stream src = null; // remote data source
        Stream dst = context.Response.OutputStream;

        // set content type, etc

        var res = new MyResult();

        AsynchCopy(src, dst, () =>
            {
                ((ManualResetEvent)res.AsyncWaitHandle).Set();
                cb(res);
                src.Close();
                dst.Flush();
            });

        return res;
    }

    public void EndProcessRequest(IAsyncResult result)
    {
    }

    public bool IsReusable
    {
        get { return true; }
    }

    public void ProcessRequest(HttpContext context)
    {
        throw new NotImplementedException();
    }

    class MyResult : IAsyncResult
    {
        public MyResult()
        {
            AsyncWaitHandle = new ManualResetEvent(false);
        }

        public object AsyncState
        {
            get { return null; }
        }

        public WaitHandle AsyncWaitHandle
        {
            get;
            private set;
        }

        public bool CompletedSynchronously
        {
            get { return false; }
        }

        public bool IsCompleted
        {
            get { return AsyncWaitHandle.WaitOne(0); }
        }
    }

    public static void AsynchCopy(Stream src, Stream dst, Action done)
    {
        byte[] buffer = new byte[2560];
        AsyncCallback readCallback = null, writeCallback = null;

        readCallback = (readResult) =>
        {
            int read = src.EndRead(readResult);
            if (read > 0)
            {
                dst.BeginWrite(buffer, 0, read, writeCallback, null);
            }
            else
            {
                done();
            }
        };

        writeCallback = (writeResult) =>
        {
            dst.EndWrite(writeResult);
            src.BeginRead(buffer, 0, buffer.Length, readCallback, null);
        };

        src.BeginRead(buffer, 0, buffer.Length, readCallback, null);
    }
}

上面的代码未经测试,也不包含错误处理,但它应该可以帮助您入门。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

异步下载文件到客户端 的相关文章

  • 我想优化这个短循环

    我想优化这个简单的循环 unsigned int i while j 0 j is an unsigned int with a start value of about N 36 000 000 float sub 0 i 1 unsig
  • 获取 Html.TextBoxFor 字段的 HTML id

    有没有办法在 Javascript 中获取 ASP NET MVC 控件生成的客户端 ID Html TextBoxFor m gt m Name 像这样 Html IdFor m gt m Name
  • MVC4优化如何允许部分视图脚本?

    部分视图和 MVC 的一个问题是 如果您的可重用部分视图需要某些 JavaScript 则无法包含它并将其加载到页面底部的脚本部分 除了性能问题之外 这意味着像 jquery 这样必要的东西还不存在 你必须使用任何依赖 jquery 的代码
  • 如何从头开始重复C程序并清理屏幕和第一个输入值?

    我是编程新手 我写了一个简单的程序 我想一次又一次地重复该程序 并且只有当用户想要退出时它才能退出 这是我的程序 include
  • 我是否必须使用我的数据库训练 Viola-Jones 算法才能获得准确的结果?

    我尝试提取面部数据库的面部特征 但我认识到 Viola Jones 算法在两种情况下效果不佳 当我尝试单独检测眼睛时 当我尝试检测嘴巴时 运作不佳 检测图像的不同部分 例如眼睛或嘴巴 或者有时会检测到其中几个 这是不可能的情况 我使用的图像
  • 验证码怎么写?

    我正在开发一个注册表 我想放置验证码 我生成一个随机字符串 但如何将其转换为图像 否则我如何开发验证码或任何参考 谢谢 Try out 验证码 http recaptcha net plugins aspnet 或查看博客文章 使用 Asp
  • DPI 图形屏幕分辨率像素 WinForm PrintPageEventArgs

    对于运行我的应用程序的任何显示器 Dpi 点与像素有何关系 int points Screen primary public Form1 InitializeComponent points 1 primary null void OnPa
  • 单击按钮本地化应用程序

    我在我的项目 mainMaster 页面中找到了 imageButtons
  • Collection.Contains() 使用什么来检查现有对象?

    我有一个强类型的自定义对象列表 MyObject 它有一个属性Id 以及一些其他属性 假设Id of a MyObject将其定义为唯一 我想检查我的收藏是否还没有MyObject对象有一个Id在我添加新的之前 共 1 个MyObject到
  • 如何获得字符串的所有字谜

    我试图找到一个字符串的所有可能的字谜并仅使用递归将它们存储在数组中 我被困住了 这就是我所拥有的一切 int main const int MAX 10 string a ABCD string arr 10 permute arr a 0
  • 在大型数据绑定 ObservableCollection 中添加/删除许多项目,而无需冻结 GUI

    我和我的团队正在开发一个 WPF 应用程序 该应用程序显示多个并发 XamDataChart 控件 由 Infragistics 提供 每个图表都绑定到不同的 ObservableCollection 最多可包含 200 万个点 对于每个图
  • 是否可以在三元表达式上只放置一个选项?

    我只是好奇这是否可能 或者是否有办法使它成为 C 的有效语法 expression value do nothing here or put some empty block like SomeClass SomeMethod Edit 为
  • 在 C 或 C++ 中使用逗号作为宏名称

    我想做这样的事情 define define MAX 10 000 000 undef 有什么技巧可以做到吗 编辑 我知道 C 14 中的数字分隔符 我正在寻找一种技巧来对不兼容的编译器执行相同的操作 EDIT2 请考虑Variadic M
  • 同时重新排序和旋转图像的高效方法

    为了快速加载 jpeg 我为turbojpeg 实现了一个 mex wrapper 以有效地将 大 jpeg 读入 MATLAB 对于 4000x3000px 的图像 实际解码只需要大约 120 毫秒 而不是 5 毫秒 然而 像素顺序是 R
  • 类型“MyApp”已包含“MystatusBar”的定义

    我的应用程序 XAML
  • 模板是如何实例化的?

    这是一个练习 来自C 入门第五版 练习 16 27 对于每个带标签的语句 解释什么 如果有 实例化发生 如果实例化了模板 请解释原因 如果 不 请解释为什么不 第677页 template
  • 在C中更改函数内的数组

    我正在学习 C 并且很困惑为什么在 main 中创建的数组不会在函数内部更改 我假设传递的数组是一个指针 并且更改指针应该更改数组 对吧 有人可以解释这种情况下发生了什么吗 谢谢你的帮助 int main int i length 10 i
  • 在 asp.net MVC 控制器中调用异步外部 Web 服务

    在 Asp net MVC 控制器 GET 方法 中 我调用外部 Web 服务 用于 IP 地理定位 返回 IP 位置的 json 数据 如何使调用异步 以便堆栈可以在等待服务响应时继续 当 GEO IP 请求完成后 我希望能够更新数据库
  • WCF - IsOneway 的行为不像 Oneway 操作

    我已在服务的某些方法上定义了 OneWay 属性 但它们的行为并不像 Oneway 调用 我的客户等待呼叫完成并从服务返回 我假设单向操作是非阻塞操作 并且客户端不关心被调用函数会发生什么 它只是调用并忘记它 这是对的吗 问题 调用 Ope
  • 计算 .NET Core 项目的代码指标?

    我正在研究 ASP NET Core 和 NET Core 项目 对于经典的 C 项目 Visual Studio 2015 具有计算代码指标的功能 对于 NET Core 预览版 2 工具中缺少支持 在工具更加完整之前 有人知道解决方法吗

随机推荐

  • NSView mouseEntered/mouseMoved 在拖动操作期间未调用(反之亦然)

    我有一个带有透明边框的无边框窗口NSView 当鼠标光标进入透明视图时 应该会出现第二个视图 放置目标 允许用户放置文件 问题是draggingEntered 将文件拖到上方时不会被调用透明视图 因此放置目标视图永远不会出现 透明视图具有正
  • 如何使图像在轮播中居中

    如何使图像在轮播中居中 我使用 bootstrap 教程中的代码尝试了 bootstrap 3 carousel a href Webconte Details 124 img src Webconte Image 124 a div cl
  • R 中函数多态性的建议做法是什么?

    假设我想写一个函数R这是对某些数据进行充分统计的函数 例如 假设函数 调用它foo func仅取决于数据样本的样本均值 为了方便起见 我认为用户可能喜欢传递到foo func随机变量的样本 在这种情况下foo func计算样本平均值 or样
  • ZeroMQ,我们可以使用 inproc: 传输以及 pub/sub 消息传递模式吗

    设想 我们正在评估ZeroMQ 具体来说jeroMq 用于事件驱动机制 应用程序是分布式的 其中多个服务 发布者和订阅者都是服务 可以存在于同一个 jvm 中或不同的节点中 这取决于部署架构 观察 为了玩玩我创建了一个pub sub图案与i
  • 当将位图加载为 Windows 资源时,是否有办法保留 BITMAPFILEHEADER?

    我一直在使用测试一些东西SFML 1 4 http sfml dev org 简单快速的多媒体库 采用 C 和 Visual C 2008 Express Edition 为了避免我的图形程序出现外部图像 我正在测试sf Image Loa
  • 二和 Leetcode 解释、Hashmap、Javascript

    我只是想知道谁能一步一步解释这个解决方案的算法 我不知道哈希图是如何工作的 您能否还提供一个使用哈希图的基本示例 以便我理解该算法 谢谢你 var twoSum function nums target let hash for let i
  • 使用 Bash 将 KB 转换为 MB

    我使用命令来获取远程文件夹的大小 运行后它会返回 120928312 http blah com 数字大小为bytes 我想做的就是让它输出MB 以及http部分被移除 我猜想 grep 到一个文件 但不知道如何去做 您可以使用 shell
  • 如何在 Matplotlib 中在图框之外绘制矩形

    我想按照下图的样式生成子图的标题 标题下方应有一个灰色框 位于散点的顶部 这是我尝试过的代码 x random sample range 50 50 y random sample range 50 50 fig pyplot figure
  • 浮点计算根据编译器的不同而变化

    当我运行在 Windows 和 Solaris 上编译的完全相同的代码执行完全相同的浮点计算 使用双精度 时 我得到的结果略有不同 我知道由于舍入误差 结果并不准确 然而 我本以为舍入误差是与平台无关的 从而在两个平台上给出相同的 稍微不正
  • 使用 SDK 的 iPhone 应用程序上的 reCaptcha

    有人在 iPhone 应用程序上使用过 reCaptcha 吗 我正在尝试弄清楚如何将其嵌入到我的应用程序中 在 iPhone 应用程序中使用 reCaptcha 的唯一方法是在应用程序中渲染 WebView reCaptcha 有一个很好
  • Git - 远程:致命:你在一个尚未诞生的分支上

    我正在尝试设置一个钩子来从我的桌面推送到我的服务器 这在过去已经工作了无数次 但现在我在设置新网站时遇到错误 remote fatal You are on a branch yet to be born 我一如既往地完成了与命令相同的系列
  • 如何在 UML 序列图中显示实例化?

    如何显示 Web 服务器实例化视图并重新获得流的控制权 也许我没有使用正确的图表类型 非常感谢 Ruben 的答案中的图表是正确的 但缺少一般的 UML 答案 当 创建 线 在本例中为虚线 连接到所创建生命线的框 标签 顶部时 它会创建另一
  • Hibernate MappingException:外键必须与引用的主键具有相同的列数

    我有一个名为 FatRabbitCarrot 的实体 Entity public class FatRabbitCarrot private Long id private FatRabbit fatRabbit private Carro
  • STS 无法在我的计算机上启动

    我试图在 eclipse 上设置 Spring mvc 项目 基本项目进展顺利 但是使用 Restful 服务 Jersey 等开始出现许多与依赖项相关的错误 所以我打算转到STS 我正在使用 STS 2 9 2 它给我 无法创建java虚
  • 无法连接到我的 aws ec2 实例上的 neo4j 服务器 - 端口 7474

    在我的 aws ec2 实例上安装 neo4j 后 以下内容似乎表明服务器已启动 bin neo4j console Active database graph db Directories in use home usr local sh
  • 如何在 C 中对 .txt 文件内的数据进行排序

    我是新来的C编程 现在我正在编写一个程序C它读取 txt 文件并将数据存储到另一个 txt 文件中 例如 open 20150101 txt 然后获取里面的数据 2015010103I 2015010102O 然后将其存储在2015JAN
  • 使用Entity Framework时,设置FK时应该设置导航属性还是外键属性?

    我有一些代码看起来像这样 var customer dbcontext Customers Find 1 var order new Order order CustomerId customer Id dbcontext Orders A
  • Prolog 中的迷你数独求解器中途停止

    我正在学习 七周七种语言 我只是想从书中找到一个例子 它解决迷你数独网格 4x4 作者使用的是 gprolog 但我使用的是 swi prolog 无论出于何种原因 我都无法让 gprolog 在我的虚拟机上工作 但 swi prolog
  • g++ 内联汇编括号中不匹配

    g 向我抱怨以下代码中缺少括号 1 2 3 v v v asm volatile inb 1 0 a result Nd portnumber 1 2 3 正如您所看到的 括号是匹配
  • 异步下载文件到客户端

    我很难完成某件事 我正在使用 asp net MVC 4 构建邮件客户端 我现在必须将与消息 而不是附件 相关的图像下载到客户端浏览器 现在我有这个设置 客户端浏览器 gt 控制器 后端 gt 邮件服务器 澄清一下 我有一个客户端请求 其中