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

В Unix Land есть керл для этой задачи.

Есть идеи или предложения?

Изменить: это должно работать в Windows XP и Windows 7

3 ответа3

3

Один из способов отправить запрос POST с «связанными» компонентами - через PowerShell. Не зная, как вы обычно его отправляете, я могу дать только общее описание.

В основном используйте класс .NET WebClient .

$wc = New-Object System.Net.WebClient;
$wc.UploadString($url, "POST", $data);

Чтобы отправить содержимое текстового файла, прочитайте его в переменную:

$data = [System.IO.File]::ReadAllText($filename);

Если вы хотите имитировать отправку веб-формы, вам необходимо следующее:

$wc.Headers.Add("Content-type", "application/x-www-form-urlencoded");

Это обычно требует пары ключ-значение:

$data = "uploadeddata=" + [System.IO.File]::ReadAllText($filename);

Это также может помочь:

wc.Encoding = System.Text.Encoding.UTF8;

Пример с API Pastebin:

$url = "http://pastebin.com/api/api_post.php";
$filename = "test.txt";

$api_dev_key = "a Pastebin API dev key should go here";
$api_option = "paste";
$api_paste_code = [System.Uri]::EscapeDataString([System.IO.File]::ReadAllText($filename));

$data = "api_dev_key=" + $api_dev_key + "&api_option=" + $api_option + "&api_paste_code=" + $api_paste_code;

$wc = New-Object System.Net.WebClient;
$wc.Headers.Add("Content-type", "application/x-www-form-urlencoded");
$wc.UploadString($url, "POST", $data);

Все это на самом деле основано на программе на C #, которую я писал, так что может быть более короткий путь. Обычно нет необходимости в «однострочниках».

И прежде чем кто-либо предложит использовать Get-Content для чтения текстового файла, Get-Content возвращает массив с одной строкой на строку. Данные POST будет сложнее построить из этого.

0

в то время как загрузка файла через HTTP из скрипта в Windows была посвящена загрузке файла из CLI, вы также можете использовать те же инструменты для загрузки:

Итак, это должно работать (powershell):

$client = new-object system.net.webclient
$client.uploadFile("http://example.com", "C:\Full\Path\To\File.txt")
0

Не найдя кроссплатформенного решения в Windows XP, Windows 7 и Windows Server 2003, мы применили подход Java-клиента с использованием клиентских библиотек Apache HTTP .

Компиляция:

javac -cp "lib\httpclient-4.1.3.jar; lib\httpcore-4.1.4.jar; lib\httpmime-4.1.3.jar" HttpSubmitter.java

С помощью:

java -cp lib\httpclient-4.1.3.jar; lib\httpmime-4.1.3.jar; lib\httpcore-4.1.4.jar; lib\httpcore-4.1.4.jar; lib\commons-logging-1.1 .1.jar; Lib \ Обще-кодек-1.4.jar ;. HttpSubmitter "Имя пользователя" textfile1.txt textfile2.txt ... textfilen.txt

Источник:

Этот файл загружает некоторые файлы на веб-сервер, и возвращаемая строка является URL-адресом, который затем открывается в Internet Explorer.

import java.io.File;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.ContentBody;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.util.EntityUtils;

public class HttpSubmitter {
  public static void main(String[] args) throws Exception {
    String username = null;
    HttpClient httpclient = new DefaultHttpClient();
    httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
    MultipartEntity mpEntity = new MultipartEntity();
    int counter = 0;
    for (String filename: args) {
        // First parameter passed will be the username, the rest are files.
        if (username == null) {
            username = filename;
        } else {
            // Attach file contents to the message
            File file = new File(filename);
            ContentBody cbFile = new FileBody(file, "text/plain");
            mpEntity.addPart("userfile" + ++counter, cbFile);

        }
    }
    ContentBody cbUsername = new StringBody(username);
    mpEntity.addPart("username", cbUsername);
    String url = "http://example.com/endpoint";
    HttpPost httppost = new HttpPost(url);
    httppost.setEntity(mpEntity);
    System.out.println("executing request " + httppost.getRequestLine());

    HttpResponse response = httpclient.execute(httppost);
    HttpEntity resEntity = response.getEntity();

    System.out.println(response.getStatusLine());
    if (resEntity != null) {
        // Returned string will be a URL, we pass it as a url to internet explorer
        // Please keep in mind the security implications of parsing a parameter you don't control to internet explorer.
        String confirmation_page = EntityUtils.toString(resEntity);
        String ie = "\"C:\\Program Files\\Internet Explorer\\iexplore.exe\" " + confirmation_page;
        // Runtime.getRuntime().exec(ie);
        System.out.println(confirmation_page);

    }
    if (resEntity != null) {
        resEntity.consumeContent();
    }

    httpclient.getConnectionManager().shutdown();
  }
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .