【问题标题】:Post documents from client machine to server将文档从客户端机器发布到服务器
【发布时间】:2014-02-04 11:36:27
【问题描述】:

我们的要求是让用户能够将文档从他们的机器(客户端) - windows 机器发布到服务器。这些可以是任何类型的文档、pdf、图像、文档和任何大小。 我想知道将所有这些数据发送到我们的 sql 服务器的最佳方式是什么? 我正在考虑编写一个运行后台进程以发送文件的 windows/wpf 应用程序。 但是存在连接性、数据量等问题。 任何帮助深表感谢。 谢谢

【问题讨论】:

  • 编写将文件作为输入的 WCF 服务 :)

标签: wpf windows wcf web-services document


【解决方案1】:

无法回答“最好的方法”,因为我没有亲自尝试过所有方法,但我已经完成了与您所描述的类似的工作。

简而言之,您可以在 SQL 服务器上或附近设置主机 WCF Web 服务,该服务从 WCF 客户端获取字节数组或流,将字节写入数据库中的 varBinary(max) 字段。

但是这种 WCF 方法需要您编写兼容的 WCF 客户端应用程序(配置为与您的主机连接),您的客户端将下载、安装并在其计算机上运行,​​以便上传目标文件。在我看来,这是这种方法的缺点——支持客户的软件需求。

如果您只有 10 个您认识和信任的用户,那么这种客户端-主机方法可以正常工作。但是,如果涉及更多用户并且您不确定他们的计算机能力,我会很想在公司内部网上创建一个网页,任何用户(无需安装任何东西)都可以从中浏览,选择然后上传他们的文件到您的服务器。

想象你自己维护这个东西,然后决定。

【讨论】:

  • 谢谢布赖恩。问题是客户端机器需要提供上传文档功能,并且它们应该能够离线上传文档,这些文档会在某个时候发送到我们的主数据库服务器。所以我不能采用网页的方法。你听说过亚马逊网络服务上传文件吗?
  • 抱歉,我回复你的速度很慢。我真的很忙。不,我还没有听说过用于上传的亚马逊网络服务。我可能会使用 Javascript 在客户端计算机上进行上传、浏览业务。这是我首先要看的地方......在那之后,我猜你需要一个 ActiveX 管理单元或其他东西。
【解决方案2】:

要使用 Web 服务 (WCF) 在服务器上添加文件,请像这样添加您的服务方法!

[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "AddFile", BodyStyle = WebMessageBodyStyle.Wrapped)]
string AddFile(Stream fileContent);

在你的实现中!执行以下操作!

public string AddFile(Stream fileContent)
{
    using (FileStream fs = new FileStream("Your\File\Path", FileMode.Create))
    {
        fileContent.CopyTo(fs);
        fileContent.Close();
    }
    return "File Added Successfully";
}

从客户端调用这个 WebService!添加以下代码。

private string uploadFile(string filePath)
    {
        //HttpPostedFileBase file;
        string fileName = System.IO.Path.GetFileName(filePath);
        string url = @"http://localhost:51260/AddFileService.svc/AddFile";

        var uri = new Uri(url);
        var request = (HttpWebRequest)WebRequest.Create(uri);
        request.ContentType = "application/octet-stream";
        request.Method = WebRequestMethods.Http.Post;

        FileStream file = new FileStream(filePath, FileMode.Open);
        StreamContent fileContent = new StreamContent(file);

        using (var requestStream = request.GetRequestStream())
        {
            byte[] fileDataInByte = null;
            using (BinaryReader binaryReader = new BinaryReader(file))
            {
                fileDataInByte = binaryReader.ReadBytes((int)file.Length);
            }
            requestStream.Write(fileDataInByte, 0, fileDataInByte.Length);
        }

        //Call REST and get a response back
        using (var response = request.GetResponse())
        {
            StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
            return reader.ReadToEnd();
        }
    }

我希望它会有所帮助!

谢谢

【讨论】:

  • 感谢费赞。还有一个问题,如果失败会发生什么,例如:如果用户断开互联网连接或文件发送不完整?我的问题是用户一次可以附加许多文件,并且它们也没有大小限制。
  • 据我所知大小限制!它可以在 Web.config 文件中进行调整。如何检查文件是否完整然后我们需要更多地挖掘它,但您现在可以从这里开始!从小文件开始,先测试你的 Service 是否接受文件。
  • 为了确保一个文档是完整的,我们所做的是:在客户端,在我们发送文件之前,我们计算文件内容的 MD5 哈希,然后我们发送这个哈希字符串文件到主机。在主机端,我们获取文件并计算另一个 MD5 哈希。如果客户端和主机端的哈希匹配,则您拥有整个文件,否则,您只有文件的一部分。很简单,真的。 .... 是的,您可以使用称为节流的方法调整大小限制。
  • 谢谢布赖恩。那是一个好主意。我将使用上面的代码和您的建议启动一个示例应用程序。
猜你喜欢
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
  • 2016-04-17
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
  • 2021-02-15
相关资源
最近更新 更多