Asp.net mvc 将文件从一个MVC3操作发布到另一个站点
这听起来可能很疯狂,但我有一个MVC3操作(服务器端代码),需要将文件发布到另一个网站。我可以控制这两个站点,但第二个站点从未收到发布的文件数据。我使用WebRequest成功地从远程站点请求文件,因此我想我可以使用以下方法发布文件数据:Asp.net mvc 将文件从一个MVC3操作发布到另一个站点,asp.net-mvc,asp.net-mvc-3,post,httpwebrequest,multipartform-data,Asp.net Mvc,Asp.net Mvc 3,Post,Httpwebrequest,Multipartform Data,这听起来可能很疯狂,但我有一个MVC3操作(服务器端代码),需要将文件发布到另一个网站。我可以控制这两个站点,但第二个站点从未收到发布的文件数据。我使用WebRequest成功地从远程站点请求文件,因此我想我可以使用以下方法发布文件数据: private WebRequest _SetupCopyToRequest(string source, string expectedDestination) { var request = HttpWebRequest.Create(_Setti
private WebRequest _SetupCopyToRequest(string source, string expectedDestination)
{
var request = HttpWebRequest.Create(_Settings.CopyToServerUrl);
var info = new FileInfo(source);
request.Method = "POST";
request.ContentLength = info.Length;
request.ContentType = "multipart/form-data";
var dispositionValue = String.Format("form-data; name=\"file\"; filename=\"{0}\"", expectedDestination);
request.Headers.Set("Content-Disposition", dispositionValue);
using (var destStream = request.GetRequestStream())
{
using (var sourceStream = info.OpenRead())
{
var length = (int) info.Length;
var buffer = new byte[info.Length];
sourceStream.Read(buffer, 0, length);
destStream.Write(buffer, 0, length);
}
}
return request;
}
我的问题是,当我在第一个站点上调用request.GetRequestStream()
,而在第二个站点上request.Files为空时,接收站点上的操作就会收到请求。以下是第二个站点接收操作的代码:
[HttpPost]
public ActionResult CopyToServer()
{
if (Request.Files.Count == 0 || Request.Files[0].ContentLength == 0)
return new ContentResult();
var file = Request.Files[0];
var fileName = Path.GetFileName(file.FileName);
var directory = Path.GetDirectoryName(file.FileName);
var uniqueFileName = CeoPath.GetUniqueFileName(directory, fileName);
var path = Path.Combine(directory, uniqueFileName);
file.SaveAs(path);
return new ContentResult {Content = path};
}
那么,如何将文件数据从第一个站点的服务器发送到第二个站点的服务器?我猜您的内容类型搞乱了-您声明要发送多部分表单数据,但我不知道您在哪里进行正确的多部分编码:
上传文件时需要使用
多部分/表单数据
编码。对于单个文件上传,您可以使用该方法,或者我在博客中介绍了一种允许您上传的技术。通过搜索HttpWebRequest找到了我的答案,并在上找到了这个答案。尤其是链接到。因此,我用以下工作代码替换了我的第一个方法:
public string CopyToServer(string source, string expectedDestination)
{
var file = new UploadFile(source, "file", null);
var form = new NameValueCollection();
form["expectedFileName"] = expectedDestination;
var request = (HttpWebRequest) WebRequest.Create(_Settings.CopyToServerUrl);
var response = HttpUploadHelper.Upload(request, new[] {file}, form);
using (var s = response.GetResponseStream())
{
using (var sr = new StreamReader(s))
{
return sr.ReadToEnd();
}
}
}
万岁