将文件从一个MVC3操作发布到另一个站点

时间:2011-08-24 15:52:35

标签: asp.net-mvc asp.net-mvc-3 post httpwebrequest multipartform-data

这可能听起来很疯狂,但我有一个MVC3动作(服务器端代码)需要将文件发布到另一个网站。我控制了两个站点,但第二个站点从未接收过发布的文件数据。我使用WebRequest成功从远程站点请求文件,所以我想我可以使用这种方法发布文件数据:

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

那么如何将第一个站点服务器上的文件数据发布到第二个站点的服务器上呢?

3 个答案:

答案 0 :(得分:2)

您需要使用multipart/form-data编码来上传文件。对于单个文件上传,您可以使用UploadFile方法,或者我在博客上发布了一种允许您upload multiple files的技术。

答案 1 :(得分:1)

我的猜测是你的内容类型搞砸了 - 你宣称你正在发送多部分表单数据,但我看不到你在哪里进行正确的多部分编码:

http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.2

答案 2 :(得分:0)

通过搜索SO寻找HttpWebRequest找到我的答案,并在Upload files with HttpWebRequest (multipart/form-data)上遇到了这个问题。特别是Upload files using an RFC 1867 POST request with HttpWebRequest/WebClient的链接。所以我用以下工作代码替换了我的第一个方法:

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

乌拉!