Загрузка...

Загрузка скриншота экрана на сервер через xNet (POST) без формы

Тема в разделе C# создана пользователем RaysMorgan 27 сен 2016. 2235 просмотров

Загрузка...
  1. RaysMorgan
    RaysMorgan Автор темы 27 сен 2016 https://lolz.live/support-tickets/open 51 796 7 мар 2013
    Всем привет. Понадобилась кнопочка, которая делает скриншот текущей программы и заливает его на сервер.
    Подключаем 4 либы. Все это будем делать на старом любимом xNet
    Код

    using xNet;
    using System.Drawing;
    using System.Runtime.InteropServices;
    using System.Drawing.Imaging;
    using System.Diagnostics;

    Где-нибудь в начале объявляем переменные для названия скриншота и текущего времени/даты
    Код

    string screenshotName;
    string nowTime = DateTime.Now.ToString("**-mm-ss");
    string nowDate = DateTime.Now.ToString("dd-MM");

    Создаем метод, проверяющий наличие папки со скриншотами
    Код

    private void checkSrcDir()
    {
    if (!Directory.Exists("screenshots"))
    {
    Directory.CreateDirectory("screenshots");
    }
    }

    При клике на кнопку вешаем событие:
    Код

    private void doScreenShot_Click(object sender, EventArgs e)
    {
    Process proc = Process.GetProcessesByName("myProc").First(); // получаем наш процесс
    if (SetForegroundWindow(proc.MainWindowHandle))
    {
    RECT srcRect;
    if (!proc.MainWindowHandle.Equals(IntPtr.Zero))
    {
    if (GetWindowRect(proc.MainWindowHandle, out srcRect))
    {
    int width = srcRect.Right - srcRect.Left;
    int height = srcRect.Bottom - srcRect.Top;

    Bitmap bmp = new Bitmap(width, height);
    Graphics screenG = Graphics.FromImage(bmp);

    try
    {
    screenG.CopyFromScreen(srcRect.Left, srcRect.Top,
    0, 0, new Size(width, height),
    CopyPixelOperation.SourceCopy);
    nowTime = DateTime.Now.ToString("**-mm-ss");
    nowDate = DateTime.Now.ToString("dd-MM");
    screenshotName = "screen_" + nowTime + "_" + nowDate + ".jpg"; // изменяем название скриншота
    checkSrcDir(); // проверяем папку со скриншотами
    bmp.Save("screenshots\\" + screenshotName, ImageFormat.Jpeg); // сохраняем скриншот
    HttpRequest req = new HttpRequest();
    req.UserAgent = Http.ChromeUserAgent();
    req.Referer = "http://yandex.ru";
    var multipartContent = new xNet.MultipartContent()
    {
    {new FileContent("screenshots\\"+screenshotName), "upload", screenshotName}
    };
    string response = req.Post("http://site.ru/upload.php", multipartContent).ToString();
    MessageBox.Show(response); // для отладки

    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
    finally
    {
    screenG.Dispose();
    bmp.Dispose();
    }
    }
    }
    }
    }

    myProc - замените на название процесса вашей программы (без .exe)
    Разберем вот эту строчку:
    Код

    var multipartContent = new xNet.MultipartContent()
    {
    {new FileContent("screenshots\\"+screenshotName), "upload", screenshotName}
    };

    "screenshots\\"+screenshotName - путь до скриншота на вашем компьютере
    upload - название массива для php обработки ($_FILES['upload'][])
    screenshotName - название файла, которое будет передано пхп скрипту.
    site.ru/upload.php - замените на путь до вашего скрипта.

    Далее переходим к пхп:
    Код

    $filename = md5(time());
    move_uploaded_file ($_FILES['upload']['tmp_name'], 'screenshots/'.$filename.'.jpg');
    echo 'http://site.ru/screenshots/'.$filename; // для показа юзеру, куда сохранился скриншот
    Данный код будет загружать скриншот в папку screenshots под названием $filename (случайная мд5 строка).
    Не забудьте сделать проверки на наличие файла и mime тип файла.
    P.S. для отладки можете выводить массивы $_FILES и $_POST :
    Код

    echo '<br>files array:<br>';
    print_r($_FILES);
    echo '<br>post array:<br>';
    print_r($_POST);
     
  2. RaysMorgan
    RaysMorgan Автор темы 6 окт 2016 https://lolz.live/support-tickets/open 51 796 7 мар 2013
    Вариант через обычный WebClient
    Код

    WebClient webClient = new WebClient();
    webClient.Encoding = System.Text.Encoding.GetEncoding("UTF-8");
    var responseBytes = webClient.UploadFile("http://site.ru/image.php", "screenshots\\"+screenshotName);
    string response = System.Text.Encoding.UTF8.GetString(responseBytes);
    Clipboard.SetText(response);
     
  3. asazs
    asazs 7 ноя 2016 Заблокирован(а) 34 7 ноя 2016
    Спасибо, как раз искал!!
     
  4. Donald_inactive24663
    Donald_inactive24663 13 ноя 2016 Заблокирован(а) 217 22 ноя 2014
    А можно по другому с загрузкой на imgur
    Код

    using (var w = new WebClient())
    {
    var values = new System.Collections.Specialized.NameValueCollection
    {
    { "image", Convert.ToBase64String(File.ReadAllBytes("путь до файла скриншота")) }
    };
    w.Headers.Add("Authorization", "Client-ID *клиент ид получаем на https://api.imgur.com/oauth2/addclient выбирая 3-ю галочку*");
    byte[] response = w.UploadValues("https://api.imgur.com/3/upload.xml", values);
    System.Xml.Linq.XDocument xDocument = System.Xml.Linq.XDocument.Load(new MemoryStream(response));
    Clipboard.SetText(Convert.ToString(xDocument.Root.Element("link")).Replace("<link>", "").Replace("</link>", "")); // здесь немного говнокода
    MessageBox.Show("Прямая ссылка на скриншот сохранена в буффер обмена");
    }
     
    13 ноя 2016 Изменено
  5. IIIaKa
    И в правду заливаешь все то что искал) Спасибо!
     
  6. zHackerD4
    zHackerD4 25 июн 2018 zHd4 10 18 сен 2017
    Давно думал об этом, так как заебало уже подрубать FTP для этой цели.
    Спасибо.
     
  7. _GOD_
    _GOD_ 23 сен 2018 C# PHP JS NodeJS Python MongoDb 305 8 янв 2017
    Я бы предложил такой вариант, он немного проще и короче
    Код

    Bitmap bmp = new Bitmap(this.Width, this.Height);
    Graphics graphics = Graphics.FromImage(bmp);
    graphics.CopyFromScreen(this.Location.X, this.Location.Y, 0, 0, new Size(this.Width, this.Height), CopyPixelOperation.SourceCopy);
    Directory.CreateDirectory("Screenshots");
    string screenname = $"Screenshots\\{DateTime.Now.ToString("yyyy.MM.dd_HH-mm-ss")}.jpg";
    bmp.Save(screenname, ImageFormat.Jpeg);
    //Ну а дальше выгрузка файла screenname (по желанию)
     
Top