Ваш ключ: необходима авторизация | MyProxy - бесплатный обменник валидных прокси между пользователями форума.

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

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

Войдите для ответа
  1. ERROR404 Администратор

    ERROR404
    Статус:
    Вне сети
    Всем привет. Понадобилась кнопочка, которая делает скриншот текущей программы и заливает его на сервер.
    Подключаем 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("HH-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("HH-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);
     
    27 сен 2016 #1
    andyk и GameRocs нравится это.
  2. ERROR404 Администратор

    ERROR404
    Статус:
    Вне сети
    Вариант через обычный 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);
     
    6 окт 2016 #2
    andyk нравится это.
  3. asazs Местный

    asazs
    Статус:
    Вне сети
    Сообщения:
    57
    Симпатии:
    33
    Регистрация:
    07.11.16
    Спасибо, как раз искал!!
     
    7 ноя 2016 #3
  4. Donald Местный

    Donald
    Статус:
    Вне сети
    Сообщения:
    25
    Симпатии:
    26
    Регистрация:
    22.11.14
    А можно по другому с загрузкой на 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 #4
    Последнее редактирование модератором: 17 ноя 2016
    ERROR404 нравится это.
Загрузка...
Top