我有一个文本文件,我想将其内容发布到网络服务器。我想使用 Windows 捆绑的应用程序来完成此操作。我不介意编写批处理脚本来执行此操作。但我不想为此任务添加新软件。
在 unix 领域中,有 curl 可以完成这项任务。
有什么想法或建议吗?
编辑:这需要在 Windows XP 和 Windows 7 中运行
答案1
发送带有“捆绑”组件的 POST 请求的一种方法是通过 PowerShell。由于不知道您通常如何发送它,我只能给出一个一般性的描述。
基本上,使用.NETWebClient
类。
$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;
Pastebin API 示例:
$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 数据会比较困难。
答案2
尽管使用 Windows 中的脚本通过 HTTP 下载文件是关于从 CLI 下载文件,您也可以使用相同的工具进行上传:
因此,这应该可以工作(powershell):
$client = new-object system.net.webclient
$client.uploadFile("http://example.com", "C:\Full\Path\To\File.txt")
答案3
由于没有找到跨 Windows XP、Windows 7 和 Windows Server 2003 的跨平台解决方案,我们采用了使用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\commons-codec-1.4.jar;. HttpSubmitter "用户名" textfile1.txt textfile2.txt ... textfilen.txt
来源:
该文件将一些文件上传到Web服务器,返回的字符串是一个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();
}
}