Quais ferramentas empacotadas com o Windows podem ser usadas para fazer upload de um arquivo de texto para a web?

0

Eu tenho um arquivo de texto e quero publicar seu conteúdo em um servidor da web. Eu gostaria de fazê-lo usando aplicativos que vêm junto com o Windows. Não me importo de escrever um script em lote para fazer isso. Mas eu não quero adicionar novos softwares para essa tarefa.

Em unix land, há uma onda para essa tarefa.

Alguma ideia ou sugestão?

Editar: isso precisa funcionar no Windows XP e no Windows 7

    
por Ivan 11.05.2012 / 08:16

3 respostas

0

Não tendo encontrado nenhuma solução multi-plataforma em Windows XP, Windows 7 e Windows Server 2003, tomamos a abordagem de um cliente Java usando o Apache HTTP Client .

Compilando:

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

Usando:

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\commons-codec-1.4.jar;. HttpSubmitter "Username" textfile1.txt textfile2.txt ... textfilen.txt

Fonte:

Este arquivo faz o upload de alguns arquivos para um servidor web, e a string retornada é uma URL que é aberta no 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();
  }
}
    
por 19.06.2012 / 06:53
3

Uma maneira de enviar uma solicitação POST com componentes "incluídos" é por meio do PowerShell. Sem saber como você normalmente enviaria, só posso dar uma descrição geral.

Basicamente, use a classe .NET WebClient .

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

Para enviar o conteúdo de um arquivo de texto, leia-o em uma variável:

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

Se você quiser imitar o envio de um formulário da web, será necessário o seguinte:

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

Isso normalmente requer pares de valores-chave:

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

Isso também pode ajudar:

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

Exemplo com a API do 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);

Tudo isso é realmente baseado em um programa em C # que eu estava escrevendo, então pode haver um caminho mais curto. Não há necessidade real de "one-liners", geralmente.

E antes que alguém sugira usar Get-Content para ler o arquivo de texto, Get-Content retornará uma matriz com uma string por linha. Os dados do POST seriam mais difíceis de construir a partir disso.

    
por 11.05.2012 / 09:06
0

enquanto Faça o download de um arquivo via O HTTP de um script no Windows era sobre o download de um arquivo da CLI. Você também pode usar as mesmas ferramentas para fazer o upload:

então, isso deve funcionar (powershell):

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