Загрузка...

Uploading a screenshot to the server via xNet POST without a form

Thread in C# created by RaysMorgan Sep 27, 2016. 2243 views

  1. RaysMorgan
    RaysMorgan Topic starter Sep 27, 2016 Че скажете 54,034 Mar 7, 2013
    Всем привет. Понадобилась кнопочка, которая делает скриншот текущей программы и заливает его на сервер.
    Подключаем 4 либы. Все это будем делать на старом любимом xNet
    Code

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

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

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

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

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

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

    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)
    Разберем вот эту строчку:
    Code

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

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

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

    $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 :
    Code

    echo '<br>files array:<br>';
    print_r($_FILES);
    echo '<br>post array:<br>';
    print_r($_POST);
     
  2. RaysMorgan
    RaysMorgan Topic starter Oct 6, 2016 Че скажете 54,034 Mar 7, 2013
    Вариант через обычный WebClient
    Code

    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 Nov 7, 2016 Banned 32 Nov 7, 2016
    Спасибо, как раз искал!!
     
  4. Donald_inactive24663
    Donald_inactive24663 Nov 13, 2016 Banned 217 Nov 22, 2014
    А можно по другому с загрузкой на imgur
    Code

    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("Прямая ссылка на скриншот сохранена в буффер обмена");
    }
     
  5. IIIaKa
    И в правду заливаешь все то что искал) Спасибо!
     
  6. zHackerD4
    zHackerD4 Jun 25, 2018 zHd4 10 Sep 18, 2017
    Давно думал об этом, так как заебало уже подрубать FTP для этой цели.
    Спасибо.
     
  7. renameduser_73608
    renameduser_73608 Sep 23, 2018 C# PHP JS NodeJS Python MongoDb 305 Jan 8, 2017
    Я бы предложил такой вариант, он немного проще и короче
    Code

    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
Loading...