如何将大文件从 MS Word 插件 (VBA) 传输到 Web 服务器?
概述
我有一个用 VBA(Visual Basic for Applications)编写的 Microsoft Word 加载项,它将文档及其所有相关内容(嵌入媒体)压缩到 zip 存档中。 创建 zip 存档后,它将文件转换为字节数组并将其发布到 ASMX Web 服务。 这大多有效。
问题
我遇到的主要问题是将大文件传输到网站。 我可以成功上传大约 40MB 的文件,但无法上传 140MB 的文件(超时/一般失败)。
第二个问题是,如果 zip 存档太大,则在 VBScript Word 插件中构建字节数组可能会因客户端计算机内存不足而失败。
潜在的解决方案
我正在考虑以下选项,并寻求有关任一选项或任何其他建议的反馈。
选项一
在客户端 (MS Word VBA) 上打开一个文件流,一次读取一个“块”,然后传输到 ASMX Web 服务,该服务将这些“块”组装到服务器上的一个文件中。
这样做的好处是不向应用程序添加任何额外的依赖项或组件,我只会修改现有的功能。 (依赖项越少越好,因为该解决方案应该在各种服务器环境中工作并且相对容易设置。)
问题:
- 是否有这样做的示例或任何推荐的技术(在 VBA 中的客户端上或在 Web 服务中) C#/VB.NET)?
选项二
我了解 WCF 可以通过“分块”或流数据传输大文件的问题提供解决方案。 但是,我对 WCF 不是很熟悉,并且不确定它到底有什么功能,或者我是否可以从 VBA 与 WCF 服务进行通信。 这样做的缺点是需要添加另一个依赖项(.NET 3.0)。 但如果使用 WCF 绝对是一个更好的解决方案,我可能不介意采用这种依赖关系。
问题:
- WCF 是否可靠地支持这种性质的大文件传输? 如果是这样,这涉及什么? 有资源或例子吗?
- 您可以从 VBA 调用 WCF 服务吗? 有什么例子吗?
Overview
I have a Microsoft Word Add-In, written in VBA (Visual Basic for Applications), that compresses a document and all of it's related contents (embedded media) into a zip archive. After creating the zip archive it then turns the file into a byte array and posts it to an ASMX web service. This mostly works.
Issues
The main issue I have is transferring large files to the web site. I can successfully upload a file that is around 40MB, but not one that is 140MB (timeout/general failure).
A secondary issue is that building the byte array in the VBScript Word Add-In can fail by running out of memory on the client machine if the zip archive is too large.
Potential Solutions
I am considering the following options and am looking for feedback on either option or any other suggestions.
Option One
Opening a file stream on the client (MS Word VBA) and reading one "chunk" at a time and transmitting to ASMX web service which assembles the "chunks" into a file on the server.
This has the benefit of not adding any additional dependencies or components to the application, I would only be modifying existing functionality. (Fewer dependencies is better as this solution should work in a variety of server environments and be relatively easy to set up.)
Question:
- Are there examples of doing this or any recommended techniques (either on the client in VBA or in the web service in C#/VB.NET)?
Option Two
I understand WCF may provide a solution to the issue of transferring large files by "chunking" or streaming data. However, I am not very familiar with WCF, and am not sure what exactly it is capable of or if I can communicate with a WCF service from VBA. This has the downside of adding another dependency (.NET 3.0). But if using WCF is definitely a better solution I may not mind taking that dependency.
Questions:
- Does WCF reliably support large file transfers of this nature? If so, what does this involve? Any resources or examples?
- Are you able to call a WCF service from VBA? Any examples?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我最终实现了原始问题中引用的选项一。
我在 VBA 中对文件进行“分块”,并将每个“分块”传输到 Web 服务。 我基于此处找到的代码解决方案的 VBA 部分: Copy Large File by chunk with Progress通知。 但是,我没有将其复制到文件系统,而是将其发送到服务器。
代码:VBA Land
下面是创建文件块的(模糊的)VBA 代码:
下面是引用的将块上传到服务器的 VBA 方法:
代码:C# ASMX Web 服务
现在,在服务器端,Web 服务方法接受一些重要的参数。
文件(每个块都有相同的文件
name)
每个chunk的
(与文件名一起使用
提供独特的有序部分
文件系统上的文件)
继续合并所有“块”
并自行清理”标志。int
index 和 bool isLastChunk。通过 VBA 世界提供的上下文,我知道如何保存每个文件块,然后在 isLastChunk 标志为 true 时将它们组合起来。
以下是 C# 代码将每个传入块写入文件系统:
以下是合并所有 zip 文件“块”的 C# 代码:
I ended up implementing option one referenced in the original question.
I "chunk" the file in VBA and transfer each "chunk" to the web service. I based the VBA portion of the solution on the code found here: Copy Large File by Chunk with Progress Notification. Instead of copying to the file system, however, I send it to the server.
The Code: VBA Land
Here is the (fugly) VBA code that creates the file chunks:
Here is the referenced VBA method that uploads the chunks to the server:
The Code: C# ASMX Web Service
Now, on the server side, the web service method accepts a few important parameters.
file (each chunk has the same file
name)
of each chunk
(used in conjunction with fileName
to provide unique ordered partial
files on the file system)
go ahead and merge all the "chunks"
and clean up after yourself" flag.
int index and bool isLastChunk. With this context provided from the VBA world, I know enough to save each of these file chunks and then combine them when the isLastChunk flag is true.
Here is the C# code that writes each incoming chunk the the file system:
Here is the C# code to merge all of the zip file "chunks":
我已经使用 MTOM 编码传输了这样的大文件。
有关 MTOM 的更多信息,请访问:http://msdn.microsoft.com/en- us/library/aa395209.aspx
您可以在此处下载 MTOM 示例:http://msdn.microsoft.com/en-us/library/ms751514.aspx
如果您想了解有关 MTOM 的更多信息,请查看 Bustamante 的有关 WCF 的书。
至于VBA调用,我不是该领域的专家,因此我没有任何相关信息。
I've transmitted large files like this using MTOM encoding.
More info on MTOM here: http://msdn.microsoft.com/en-us/library/aa395209.aspx
You can download an MTOM sample here: http://msdn.microsoft.com/en-us/library/ms751514.aspx
Check out Bustamante's book on WCF if you want more on MTOM.
As for the VBA call, I'm not an expert in that area therefore I don't have any info in regards to it.