2017-07-29 34 views
0

UI如何写文件处理类图书馆项目运作

<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,但我怀疑这是对的吗?

但是,如何解决我的需求,然后没有任何形式的开销? 内存分配,执行&所有这些是非常关键的

+0

不太确定如何声明第一个作品 - 您的文件输入没有'name'属性,因此参数将为'null'。你又如何调用第二个“实用程序”方法 - 你的Controller中仍然需要一个操作方法来接收请求。 –

+0

@StephenMuecke,对不起!添加了缺少的细节 –

+0

它需要'name =“file”'绑定到一个参数'HttpPostedFile文件':) –

回答

1

一旦你确保控制器方法接收发布文件引用正确读取这个答案。

您不需要在类库中添加System.Web引用。而只是将文件内容传递给重构方法。此外,由于您正在制作实用课程,因此请确保它可以返回任何类型的DTO,而不仅仅是CustomerDTO。例如,您应该可以使用相同的类/方法,例如,如果您需要传入帐户文件并从中获得AccountDTO

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

// 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); 
} 

读取文件内容不需要进行重构。这是不必要的IMO。

+0

伟大的但正如我所说的保存文件是开销 –

+0

当然,用户上传文件,需要阅读的内容,反序列化和做一些操作(即返回到用户界面)就是这样,如果用户上传数百个文件保存很多文件没有开销 –

+0

如果你不想保存上传文件的副本,那么不要保存它,而应该使用'file.InputStream'。你也没有提到在你的问题中多个文件上传的可能性。确定你清楚地指出了有问题的实际情况。 – niksofteng