Отправка файла из одного действия MVC3 на другой сайт - PullRequest
1 голос
/ 24 августа 2011

Это может показаться сумасшедшим, но у меня есть действие 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 ]

2 голосов
/ 24 августа 2011

Для загрузки файлов необходимо использовать кодировку multipart/form-data. Для загрузки одного файла вы можете использовать метод UploadFile, или я уже писал о методике, позволяющей вам upload multiple files.

1 голос
/ 24 августа 2011

Я предполагаю, что ваш тип контента все портит - вы заявляете, что отправляете многокомпонентные данные формы, но я не вижу, где вы делаете правильное многокомпонентное кодирование:

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

0 голосов
/ 24 августа 2011

Нашел мой ответ, выполнив поиск SO для HttpWebRequest, и наткнулся на него в Загрузка файлов с помощью HttpWebRequest (multipart / form-data) .Особенно ссылка на Загрузка файлов с использованием запроса POST RFC 1867 с 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();
        }
    }
}

Ура!

...