c# - 从分段文件上传中读取内容到内存

标签 c# wcf-web-api

我在将上传的 XML 文件读取为字符串而不是文件时遇到问题。

我的问题是,当我尝试访问流 (var stream = part.ContentReadStream) 时,它会关闭。我感觉它正在访问关闭的文件流。我是否错误地使用了 MultipartFormDataStreamProvider?文件大小只有几千字节,所以这应该不是问题。

    [WebInvoke(Method = "POST", UriTemplate = "{importFile}")]
    public HttpResponseMessage Upload(string importFile, HttpRequestMessage request)
    {
        if (!request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }

        // Create a stream provider for setting up output streams
        MultipartFormDataStreamProvider streamProvider = new MultipartFormDataStreamProvider();

        // Read the MIME multipart content using the stream provider we just created.
        var task = request.Content.ReadAsMultipartAsync(streamProvider);
        task.Wait();
        IEnumerable<HttpContent> bodyparts = task.Result;
        string submitter;
        if (!bodyparts.TryGetFormFieldValue("submitter", out submitter))
        {
            submitter = "unknown";
        }

        // Get list of local file names from stream provider
        IDictionary<string, string> bodyPartFileNames = streamProvider.BodyPartFileNames;


        var parser = this.parserFactoryFactory.CreateParser();
        foreach (var part in bodyparts)
        {
            using (var stream = part.ContentReadStream)
            {
                using (var streamReader = new StreamReader(stream))
                {
                    string content = streamReader.ReadToEnd();
                    var results = parser.Parse(content);
                }
            }
        }
        return new HttpResponseMessage(HttpStatusCode.Accepted);
    }  

这是我的帖子

<h3>Data import test</h3>

<form action="/api/data/Upload" enctype="multipart/form-data" method="POST">
    <input type="file" name="importFile"/>
    <input type="submit" value="Upload"/>
</form>

最佳答案

解决方案实际上非常简单。当我们不处理文件时,不需要 MultipartFormDataStreamProvider。这对我的案例来说非常顺利。

[WebInvoke(Method = "POST", UriTemplate = "{importFile}")]
public HttpResponseMessage Upload(
    string importFile, HttpRequestMessage request)
{
    if (!request.Content.IsMimeMultipartContent())
        throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);

    // Read the MIME multipart content 
    var task = request.Content.ReadAsMultipartAsync();            
    task.Wait();

    IEnumerable<HttpContent> bodyparts = task.Result;
    string submitter;
    if (!bodyparts.TryGetFormFieldValue("submitter", out submitter))
        submitter = "unknown";

    var parser = this.parserFactoryFactory.CreateParser();
    foreach (var part in bodyparts)
    {
        using (var stream = part.ContentReadStream)
        {
            using (var streamReader = new StreamReader(stream))
            {
                string content = streamReader.ReadToEnd();
                var results = parser.Parse(content);
                if (results.IsValid)
                    // do something
            }
        }
    }
    var message = new HttpResponseMessage(HttpStatusCode.Accepted);
    return message;
}  

关于c# - 从分段文件上传中读取内容到内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8239307/

相关文章:

c# - Windows 窗体控件的大小在显示设置更改时更改

c# - 为什么按下后退按钮时 MvvmCross 创建一个新的 ViewModel

wcf - WCF WebApi 如何将请求 URI 映射到适当的服务类型/操作?

c# - 哪个Lucene SearchAnalyzer用于特殊字符搜索

C# LINQ 按基类分组

wcf - 如何使用 WCF WebApi 的 HttpClient 发布 POCO

c# - 未发送 HttpClient 身份验证 header

wcf - WCF Web.API 对于生产应用程序是否安全?

c# - 根据光标位置和当前选择以编程方式更改 WPF 文本框的文本

c# - ASP.NET WebAPI 中 HttpServiceHost 的等价物是什么?