Сохраните файл в папке на другом сервере с чисто написанным кодом на сайте

Я использую mvc. Я пытаюсь сохранить файл в другой папке, то есть на другом сервере. Но раньше я использовал подход к созданию двух разных решений и сохранял файл с помощью веб-запроса. Я отправлял запрос из одного решения и отправлял его на другое решение. вот мой код

         byte[] bytes;
         var pic = System.Web.HttpContext.Current.Request.Files["ImagePath"];
          /*Creating the WebRequest object using the URL of SaveFile.aspx.*/
            System.Net.HttpWebRequest webRequest =
            (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create
            ("http://localhost:13492/Home/SaveImage");
            webRequest.Method = "POST";
            webRequest.KeepAlive = false;
            /*Assigning the content type from the FileUpload control.*/
            webRequest.ContentType = pic.ContentType ;
            /*Creating the Header object.*/
            System.Net.WebHeaderCollection headers = new System.Net.WebHeaderCollection();
            headers.Add("FileName", pic.FileName);
            /*Adding the header to the WebRequest object.*/
            webRequest.Headers = headers;
            /* Convert File Into byte array */
            using (var stream = new MemoryStream())
            {
                pic.InputStream.CopyTo(stream);
                bytes = stream.ToArray();
            }
            /*Getting the request stream by making use of the GetRequestStream method of WebRequest object.*/
            using (System.IO.Stream stream = webRequest.GetRequestStream())//Filling request stream with image stream. 
            {
                /*Writing the FileUpload content to the request stream.*/
                stream.Write(bytes, 0, pic.ContentLength);
            }
            /*Creating a WebResponse object by calling the GetResponse method of WebRequest object.*/
            using (System.Net.HttpWebResponse webResponse = (System.Net.HttpWebResponse)webRequest.GetResponse())
            {
                /*Retrieving the response stream from the WebResponse object by calling the GetResponseStream method.*/
                using (System.IO.StreamReader sr = new System.IO.StreamReader(webResponse.GetResponseStream()))
                {
                    string path = sr.ReadToEnd();
                }
            }

затем в другом решении я получал его, чтобы сохранить файл.

  public void SaveImage()
    {
        try
        {
            /*Retrieving the file name from the headers in the request. */
            string destinationFileName = Path.Combine(@"~/" + "Portfolio" + "/", Request.Headers["FileName"].ToString());
            string fileName = System.Web.HttpContext.Current.Server.MapPath(destinationFileName);
            //string path = System.IO.Path.Combine(Server.MapPath("."), Request.Headers["FileName"].ToString());
            using (System.IO.FileStream fileStream = System.IO.File.Create(fileName))
            {
                /*Getting stream from the Request object.*/
                using (System.IO.Stream stream = Request.InputStream)
                {
                    int byteStreamLength = (int)stream.Length;
                    byte[] byteStream = new byte[byteStreamLength];
                    /*Reading the stream to a byte array.*/
                    stream.Read(byteStream, 0, byteStreamLength);
                    /*Writing the byte array to the harddisk.*/
                    fileStream.Write(byteStream, 0, byteStreamLength);
                }
            }
            Response.Clear();
            /*Writing the status to the response.*/
            Response.Write(fileName);
        }
        catch (Exception ex)
        {
            /*Writing the error message to the response stream.*/
            Response.Clear();
            Response.Write("Error: " + ex.Message);
        }
    }

Итак, что мне следует изменить в коде, чтобы я мог сохранить файл в другом месте на другом сервере, не записывая код в двух разных местах.

если удаленный сервер предоставляет целевую папку как общую папку, и два сервера находятся в одной сети, вы можете сохранить файл непосредственно в общую папку (при условии, что ваше приложение имеет на это разрешение). Если папка не является общей, то она является частной для другого сервера, и вам придется отправить на сервер файл другим методом и запросить его обработку, например. HTTP-запрос, похожий на ваш первый пример, или вы можете использовать FTP или SFTP, если вам доступен любой из них. Существует множество различных (понятных) способов передачи файлов. Проводить некоторые исследования.

ADyson 11.04.2018 13:55

Вы управляете вторым сервером или используете его только для сохранения файлов? У нас есть много разных подходов к сохранению файла на другом сервере.

Sandip 11.04.2018 14:25

@Sandip Нет, мы этим не управляем. Я просто использую это. не могли бы вы предложить мне способ сохранить файл на другом сервере без написания кода в нескольких местах?

shami sheikh 11.04.2018 14:28

@shamisheikh Что не так с предложениями, которые я уже сделал выше (не говоря уже о том, что, возможно, вы приложили усилия и провели свое собственное исследование в этой очень хорошо понятной и хорошо документированной теме в Интернете)? Конечно, если это не ваш сервер, вы застряли в интерфейсах, предоставляемых теми, кто управляет сервером, если только у вас нет возможности попросить их изменить конфигурацию. Или у вас есть возможность полностью хранить эти файлы на другом сервере и игнорировать сервер, который вы используете в настоящее время? Не ясно.

ADyson 11.04.2018 14:28

Я бы посоветовал вам перейти на хранилище BLOB-объектов Azure. Здесь вы можете сохранить свой файл, а затем попросить другую команду получить доступ к файлу из самого хранилища. который будет ссылкой и доступен без каких-либо учетных данных. если этот подход соответствует вашим требованиям, я с радостью объясню подробнее

Sandip 11.04.2018 14:31

@ Sandip Нет, я не могу пойти на лазурь.

shami sheikh 11.04.2018 14:33

@ADyson ничего плохого в предложениях. Я очень благодарен вам за ваше драгоценное время. на самом деле мое требование заключается в том, что я должен сохранить некоторые изображения по другой ссылке, то есть в папке, размещенной в другом месте, и смог сделать это, но написав некоторый код, как я объяснил выше. Но почему-то я не могу написать код по той ссылке, где находится папка. Поэтому мне нужно сохранить этот файл с веб-сайта. и я провожу исследования по этому поводу. на самом деле мне не очень удобно играть с файлом.

shami sheikh 11.04.2018 14:38

тогда используйте класс webRequest.

Sandip 11.04.2018 14:40

@Sandip, не могли бы вы предложить мне любую ссылку?

shami sheikh 11.04.2018 14:41

"почему-то я не могу" ... что вы имеете в виду? Вы имеете в виду, что у вас нет доступа к серверу для развертывания на нем кода? Если вы хотите передать файлы на другой сервер, то для настройки удаленного сервера необходимо выполнить что-нибудь. Вы должны включить какую-то службу и / или развернуть код для получения входящих данных. Это не волшебство. Итак, вам нужно выяснить, что на сервере доступно (или что вы можете запросить, чтобы сделать его доступным), либо файловый ресурс, либо FTP-сервер, или что-то еще. Я уже все это объяснил. Теперь вам нужно найти свой следующий шаг.

ADyson 11.04.2018 14:44

@ADyson, я имею в виду, что у меня нет доступа к серверу для развертывания кода на нем, и это FTP-сервер. Спасибо большое :)

shami sheikh 11.04.2018 14:48

Итак, наконец, вы упомянули кое-что полезное - на сервере запущена служба FTP. Хорошо. Вы можете легко использовать код Google для передачи файлов по FTP с помощью C#. Будет доступно множество примеров и руководств. Вы еще этого не сделали?

ADyson 11.04.2018 14:50

для загрузки файлов со стороны клиента на ftp проверьте этот образец dotnetbull.com/2011/09/…

Nilesh Gajare 11.04.2018 14:55
0
13
1 665
2

Ответы 2

Следуйте ниже образец

Этот пример предназначен для создания папки на другом сервере по протоколу FTP. Пожалуйста, продлите его по мере необходимости.

using System;
using System.Net;

class Test
{
    static void Main()
    {
        WebRequest request = WebRequest.Create("ftp://host.com/directory");
        request.Method = WebRequestMethods.Ftp.MakeDirectory;
        request.Credentials = new NetworkCredential("user", "pass");
        using (var resp = (FtpWebResponse) request.GetResponse())
        {
            Console.WriteLine(resp.StatusCode);
        }
    }
}

Согласно комментарию @ADyson, вы должны включить протокол FTP перед работой с этим образцом.

это предполагает, что на удаленном сервере включен FTP, о чем мы не знаем наверняка, а также неясно, как этот фрагмент что-то делает с передачей файлов. Он создает папку (которая может быть необходима, а может и не быть), но не передает файл, о чем спрашивал OP. К тому же код без объяснения никому не очень пригодится!

ADyson 11.04.2018 14:45

@ADyson. Спасибо за комментарий. Я обновил его с пометкой. Кроме того, поскольку этот ответ основан на комментариях, добавленных к вопросу. Но да, я изменил его, чтобы улучшить.

Sandip 11.04.2018 14:55

Да FTP включен.

shami sheikh 11.04.2018 14:56

Включенный @Sandip FTP был подтвержден после того, как вы опубликовали ответ!

ADyson 11.04.2018 14:57

Рад это слышать.

Sandip 11.04.2018 14:57

Спасибо всем за драгоценное время и усилия :) У меня есть решение, и оно отлично работает.

shami sheikh 11.04.2018 16:06

У меня есть решение этой проблемы, и все работает нормально.

 public static void UploadFtpFile(string folderName, string fileName)
    {

        FtpWebRequest request;
        try
        {
            //string folderName;
            //string fileName;
            string absoluteFileName = Path.GetFileName(fileName);

            request = WebRequest.Create(new Uri(string.Format(@"ftp://{0}/{1}/{2}", "ftp.site4now.net", folderName, absoluteFileName))) as FtpWebRequest;
            request.Method = WebRequestMethods.Ftp.UploadFile;
            request.UseBinary = true;
            request.UsePassive = true;
            request.KeepAlive = true;
            request.Credentials = new NetworkCredential("Username", "Password");
            request.ConnectionGroupName = "group";

            using (FileStream fs = System.IO.File.OpenRead(fileName))
            {
                byte[] buffer = new byte[fs.Length];
                fs.Read(buffer, 0, buffer.Length);
                fs.Close();
                Stream requestStream = request.GetRequestStream();
                requestStream.Write(buffer, 0, buffer.Length);
                requestStream.Flush();
                requestStream.Close();
            }
        }
        catch (Exception ex)
        {

        }
    }

Другие вопросы по теме