如何在 C# 中正确使用 WCF REST API 上的 Stream 将文件(图像/视频/等)上传到服务器?

Posted

技术标签:

【中文标题】如何在 C# 中正确使用 WCF REST API 上的 Stream 将文件(图像/视频/等)上传到服务器?【英文标题】:How to upload files(images/videos/etc) to server using Stream on WCF REST API in C# properly? 【发布时间】:2019-07-09 13:55:17 【问题描述】:

我正在设置一个函数来使用 WCF REST API 在服务器上上传图像/视频。文件已成功上传到正确的目标文件夹,但无论是哪种文件,它们最终都变得无法读取。

我的代码(尤其是 FileStream-Write 部分)是否有问题导致这种情况发生?或者问题可能出在其他地方(例如 Web.config 文件)?

这是我的代码 sn-p:

public string uploadFile(Stream fileStream)
        
            String fileName = System.Web.HttpContext.Current.Request.QueryString["fileName"];
            String destFileName = HHCWCFApp.Properties.Settings.Default.TemporaryFilePath + fileName;
            String destLink = HHCWCFApp.Properties.Settings.Default.Hyperlink + fileName;

            try
            
                int length = 256;
                int bytesRead = 0;
                Byte[] buffer = new Byte[length];
                using (FileStream fs = new FileStream(destFileName, FileMode.Create))
                
                    do
                    
                        bytesRead = fileStream.Read(buffer, 0, length);
                        fs.Write(buffer, 0, bytesRead);
                    
                    while (bytesRead == length);
                

                fileStream.Dispose();
            
            catch (Exception ex)
            
                Console.WriteLine(ex.ToString());
            

            if (File.Exists(destFileName))
            
                return destLink;
            
            else
            
                return "Not Found";
            
        

【问题讨论】:

您需要转换为 64 位字符串。 Http 不允许二进制数据(图像),因此您必须转换为 64 位字符串,该字符串将非法二进制 http 字符转换为有效的 ascii 字符。 @jdweng 我可以问一下将文件转换为 64 位字符串的例子吗?我也应该把那部分代码放在那个函数中吗?这也适用于上传视频吗?视频文件有可能最大为 40 MB。 有4种方法:1) Convert.ToBase64String(string) 2) Convert.ToBase64String(byte[]) 3) Convert.FromBase64String(string) 4) Convert.FromBase64String(byte[]) 【参考方案1】:

您要上传什么类型的文件?较大的文件可能会违反最大请求长度,这在 Web 配置中设置如下

 <configuration> 
<system.web> 
    <httpRuntime maxRequestLength="xxxx" /> 
</system.web> 

尝试一个只有几 kb 的文本文件,如果可行,但较大的文件不可行,那么这可以很好地解决问题。我测试了你的代码,没有问题。

还请记住,您使用的 IIS 服务器也可能设置了最大请求长度,这可能会覆盖您的值。

默认长度为 4mb,您可以编写一个函数来检索该值,以便您的客户端/调用代码可以检查它要传递的文件是否超过最大大小。

请阅读 Microsoft 页面上的 here 了解更多信息。

编辑:第一次误读代码,道歉

【讨论】:

据我了解,FileStream 每次在 do-while 中循环时都会写入或上传总文件大小的 256 个字节,直到达到文件的总大小......我误解了什么在这里?

以上是关于如何在 C# 中正确使用 WCF REST API 上的 Stream 将文件(图像/视频/等)上传到服务器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WCF Rest Service 中传递多个参数:C# 中的字符串和流

如何同时使用 SOAP WCF 服务和 REST API

在 C# 中,将附件发布到 Confluence REST API 的正确方法是啥?

在 web.config C# 中配置 Rest API 客户端

WCF Rest API:如何使用邮递员发送字典

在 wcf rest 服务 C# 中使用 Stream 作为输入时缺少第一个元素