gpt4 book ai didi

java - 多部分帖子——上传文件

转载 作者:行者123 更新时间:2023-11-30 03:41:53 25 4
gpt4 key购买 nike

我正在尝试以编程方式将文件上传到服务器而不是网站。我已成功访问该网站,并且可以废弃/解析不同的网页,但我在上传文件时遇到问题。有问题的服务器正在使用 papercut 和 apache Tapestry。

这里是相关的java代码:

private String uploadFile (String params, String filePath, String HTML) throws Exception {

String postUrl = getUploadUrl(HTML);
File fileToUpload = new File(filePath);
postUrl = "http://printing.**.ca:9191" + postUrl;
String random = "";

Random ran = new Random();
for (int i = 0; i < 28; i++) {
random = random + String.valueOf(ran.nextInt(9));
}
String boundry = "---------------------------" + random;

URL obj = new URL(postUrl);
connection = (HttpURLConnection)obj.openConnection();

connection.setUseCaches(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundry);
connection.setRequestProperty("Host", "printing.**.ca:9191");
connection.setRequestProperty("User-Agent", USER_AGENT);
connection
.setRequestProperty("Accept",
"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
connection.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
connection.setRequestProperty("Referer",
"http://printing.**.ca:9191/app");
connection.setRequestProperty("Connection", "keep-alive");

for (String cookie : this.cookies) {
connection.addRequestProperty("Cookie", cookie.split(";", 1)[0]);
}
connection.setDoInput(true);
connection.setDoOutput(true);

String fileType = getFileType(fileToUpload);

PrintWriter writer = null;
try {
writer = new PrintWriter(new OutputStreamWriter(connection.getOutputStream()));
writer.println(boundry);
writer.println("Content-Disposition: " + "form-data; " + "name=\"file[]\"; " + "filename=\"" + fileToUpload.getName() + "\"");
writer.println("Content-Type: " + fileType);
writer.println();
BufferedReader reader = null;

try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileToUpload)));


for (String line; (line = reader.readLine()) != null;) {
writer.print(line);
}
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {}
}

}
writer.println(boundry + "--");
} finally {
if (writer != null) {
writer.close();
}
}
int responseCode = connection.getResponseCode();

BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuffer buffer = new StringBuffer();
String inputLine;
while((inputLine = reader.readLine()) != null) {
buffer.append(inputLine);
}
reader.close();
return null;

我使用wire shark来比较成功的请求和失败的请求,但我无法确定哪里出了问题。

这是成功的请求:

POST /upload/3229 HTTP/1.1
Host: printing.**.ca:9191
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:33.0) Gecko/20100101 Firefox/33.0
Accept: application/json
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Cache-Control: no-cache
X-Requested-With: XMLHttpRequest
Referer: http://printing.**.ca:9191/app
Content-Length: 27682
Content-Type: multipart/form-data; boundary=---------------------------8555452061745260577115383266
Cookie: JSESSIONID=1w7usft10tnew
Connection: keep-alive
Pragma: no-cache

-----------------------------8555452061745260577115383266
Content-Disposition: form-data; name="file[]"; filename="hello.xls"
Content-Type: application/vnd.ms-excel
**data***
-----------------------------8555452061745260577115383266--

这会返回 200/ok然后启动:

POST /app HTTP/1.1
Host: printing.**.ca:9191
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:33.0) Gecko/20100101 Firefox/33.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://printing.**.ca:9191/app
Cookie: org.apache.tapestry.locale=en; JSESSIONID=1w7usft10tnew
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 66

service=direct%2F1%2FUserWebPrintUpload%2F%24Form%240&sp=S1&Form1=

这是我请求的数据包:

POST /upload/3239 HTTP/1.1
Content-Type: multipart/form-data; boundary=---------------------------6735033783816657573427817664
User-Agent: Mozilla/5.0
Accept: application/json
Accept-Language: en-US,en;q=0.5
Referer: http://printing.**.ca:9191/app
X-Requested-With: XMLHttpRequest
Cache-Control: no-cache
Pragma: no-cache
Host: printing.**.ca:9191
Connection: keep-alive
Content-Length: 46431
Cookie: JSESSIONID=1i2ym6tnouzkw;

---------------------------6735033783816657573427817664
Content-Disposition: form-data; name="file[]"; filename="hello.xls"
Content-Type: application/vnd.ms-excel
**data*
---------------------------6735033783816657573427817664--

然后我得到了 200/ok启动这个:

POST /app HTTP/1.1
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Referer: http://printing.**.ca:9191/app
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache
Pragma: no-cache
Host: printing.**.ca:9191
Connection: keep-alive
Content-Length: 66
Cookie: JSESSIONID=1i2ym6tnouzkw;

service=direct%2F1%2FUserWebPrintUpload%2F%24Form%240&sp=S1&Form1=

上传文件响应时出错。对于/upload/3239,我抓取了包含上传文件表单的 HTML。该网站还使用 Dropzone.js,但能够使用简单的上传表单。另外,对于 session cookie,字符“;”发送所有其他请求并且没有任何失败。我可以访问该网站,但它似乎无法正确上传文件。

想法??

最佳答案

最后花了几个小时弄清楚如何使用 apache HttpClient 来实现这一点。这是 future 任何人都可以使用的代码。

 private String uploadFile (String filePath, String HTML) throws Exception {

String postUrl = getUploadUrl(HTML);
postUrl = "http://printing.**.ca:9191" + postUrl;
HttpPost post = new HttpPost(postUrl);

HttpClient client = new DefaultHttpClient();

MultipartEntityBuilder builder = MultipartEntityBuilder.create();

builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

String random = "";
Random ran = new Random();
for (int i = 0; i < 28; i++) {
random = random + String.valueOf(ran.nextInt(9));
}
String boundary = "---------------------------" + random;

final File file = new File(filePath);

FileBody fb = new FileBody(file, ContentType.create("application/vnd.ms-excel"), "hello.xls");

builder.addPart("file[];", fb);
builder.setBoundary(boundary);

post.setEntity(builder.build());

post.setHeader("Host", "printing.**.ca:9191");
post.setHeader("User-Agent", USER_AGENT);
post.setHeader("Accept",
"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
post.setHeader("Accept-Language", "en-US,en;q=0.5");
post.setHeader("Referer",
"http://printing.**.ca:9191/app");
post.setHeader("Connection", "keep-alive");
for (String cookie : this.cookies) {
for (String c : cookie.split(";")) {
if (c.contains("JSESSION")) {
post.setHeader("Cookie", c);
}
}
}

HttpResponse response = client.execute(post);
String reply = sendPost("http://printing.**.ca:9191/app", getUploadParameters(HTML));

return response.toString();
}

关于java - 多部分帖子——上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26666293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com