【发布时间】:2011-12-14 19:13:55
【问题描述】:
我正在开发一个具有 Winforms 和 MVC3 Web 组件的应用程序。我们需要能够将大文件从桌面上传到网络。我尝试了各种 VB 2010 WebClient 和 FTP FileUpload 替代方案,但仍然遇到权限问题,即使我提供的用户 ID 和密码与成功将文件复制到同一 MVC3 站点的 FTP 应用程序使用的相同。
在寻找替代解决方案的过程中,我研究了使用 WCF,这对于这个特定的应用程序来说似乎也很复杂和有问题。
我最接近的解决方案是在 Winforms 应用程序上使用 HttpWebRequest。以下 VB 2010 和 C# 代码 (MVC3) 成功将 Filename 和 File 数据传递给 MVC3(InputStream 包含引用和 UrlEncode 数据,但包含此数据字段的类为空。(我也只传递了文件数据没有文件名,上传的文件是从 InputStream 成功创建的 - 但方法变量仍然是 null)。虽然我可以选择 InputStream,但我更喜欢更优雅的选择。
VB 2010 Winforms 方法:
Public Shared Sub FileUpload(ByVal Filepath As String)
Try
Dim Host = System.Configuration.ConfigurationManager.AppSettings("Host")
Dim url As String = Path.Combine(Host, "UI/FileUpload")
Dim request As HttpWebRequest = HttpWebRequest.Create(url)
request.Method = "POST"
request.ContentType = "application/x-www-form-urlencoded"
Dim Filename As String = Path.GetFileName(Filepath)
Dim FileData As Byte() = GetFile2UploadData(Filepath)
Dim data As String = String.Format("FileName={0}&FileData={1}", System.Web.HttpUtility.UrlEncode(Filename), System.Web.HttpUtility.UrlEncode(FileData))
request.ContentLength = data.Length
Using sr As StreamWriter = New StreamWriter(request.GetRequestStream)
sr.Write(data)
End Using
Dim resp As HttpWebResponse = request.GetResponse
Catch ex As Exception
Throw New Exception(ex.Message)
End Try
Return
End Sub
MVC3 C# 控制器方法和类:
[HttpPost]
public ActionResult FileUpload(FileInformation fi)
{
try
{
using (FileStream fs = new FileStream(Path.Combine(System.Web.Hosting.HostingEnvironment.MapPath("~/Users/User1"), fi.FileName), FileMode.Create)) {
fs.Write(fi.FileData,0,fi.FileData.Length);
}
return Content("OK");
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
public class FileInformation
{
public string FileName;
public byte[] FileData;
}
我这几天一直在琢磨这个问题。赞赏您精辟的想法。
TIA
【问题讨论】:
标签: vb.net winforms asp.net-mvc-3 c#-4.0