【问题标题】:How to write file handling operations in class library project如何在类库项目中编写文件处理操作
【发布时间】:2017-07-29 06:52:54
【问题描述】:

用户界面

<input type = "file" title="Please upload some file" name="file" />

MVC

/*below method is called from a MVC controller 
 this method resides for now in MVC project itself*/
public IEnumerable<CustomerTO> FetchJson(HttpPostedFile file)
    {
        using (StreamReader sr = new StreamReader(file.FileName))
        {
            {
                file.saveAs("details.txt");
                string json = sr.ReadToEnd();
                IEnumerable<CustomerTO> customers=
                    JsonConvert.DeserializeObject<List<CustomerTO>>(json);
               return customers; 
            }
        }
    }

当上述方法在 MVC 项目或某种基于 Web 的项目中时,所有引用都可以找到。

但我正在考虑创建一个实用程序类来处理所有此类操作。 所以我创建了一个类库项目并添加了一个类 Utitlity.cs

类库

public IEnumerable<CustomerTO> FetchJson(HttpPostedFile file)
    {
        //but HttpPostedFile is throwing error.
        //NOTE Ideally,I shouldn't be saving the posted file
    }

现在我知道 FileUpload 是 UI 控件 HttpPostedFile 处理与此相关的所有操作。

我可以轻松添加参考using System.Web,但我怀疑这是否正确??

但是我如何在没有任何开销的情况下满足我的要求呢? 内存分配、执行和所有这些都非常关键

【问题讨论】:

  • 不太确定如何声明第一个作品 - 您的文件输入没有 name 属性,因此参数将为 null。以及如何调用第二个“实用程序”方法 - 您仍然需要在 Controller 中使用操作方法来接收请求。
  • @StephenMuecke,对不起!!添加了缺失的细节
  • 需要name="file" 才能绑定到参数HttpPostedFile file :)
  • @StephenMuecke,这也更正了。谢谢:)
  • 您仍然需要控制器方法,但在其中您可以调用 return yourUtilityAssemby.FetchJson(file); 但我建议您重命名其中一个以避免混淆(并允许您在控制器

标签: c# asp.net asp.net-mvc httppostedfilebase httppostedfile


【解决方案1】:

确保控制器方法正确接收发布的文件引用后,请阅读此答案。

您不需要在类库中添加System.Web 引用。相反,只需将文件内容传递给重构的方法。此外,由于您正在创建一个实用程序类,请确保它可以返回任何类型的 DTO 而不仅仅是CustomerDTO。例如,如果您需要传入 Accounts 文件并从中获取 AccountDTOs,您应该能够使用相同的类/方法。

事实上,您应该能够使用该代码将任何字符串内容反序列化为您想要的任何类型。你可以在这里使用Generics

// Controller.cs
public IEnumerable<CustomerTO> FetchJson(HttpPostedFile file) 
{
    string fileContent;
    using (StreamReader sr = new StreamReader(file.FileName)) {
        file.saveAs("details.txt");
        fileContent = sr.ReadToEnd();
    }

    var customers = JsonSerializer.Deserialize<List<CustomerTO>>(content); // Refactored

    return customers; 
}

// JsonSerializer.cs
public static T Deserialize<T>(string content) {
    // ...
    return JsonConvert.DeserializeObject<T>(content);
}

在Controller中使用StreamReader读取文件内容不需要重构。这是不必要的 IMO。

【讨论】:

  • 太棒了。但正如我提到的,保存文件对我来说是开销
  • 当然。用户上传文件,需要读取内容,反序列化并做一些操作(ex return to UI)就是这样。如果用户上传了数百个文件,那么保存这么多文件并不是开销
  • 如果您不想要上传文件的副本,请不要保存。而是使用file.InputStream。此外,您没有在您的问题中谈论多个文件上传的可能性。确保您清楚地指出有问题的实际情况。
猜你喜欢
  • 1970-01-01
  • 2012-04-01
  • 2023-03-08
  • 2010-09-06
  • 2013-10-26
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
  • 2013-03-16
相关资源
最近更新 更多