【问题标题】:multipart post -- uploading a filemultipart post -- 上传文件
【发布时间】:2014-12-27 06:41:42
【问题描述】:

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

这里是相关的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,但能够回退到一个简单的上传表单。 同样对于会话 cookie,字符“;”在所有其他请求上发送,并且没有任何失败。我可以访问该网站,但它似乎无法正确上传文件。

想法??

【问题讨论】:

    标签: java parsing file-upload web-scraping dropzone.js


    【解决方案1】:

    最后花了几个小时弄清楚如何使用 apache HttpClient 来做这件事。这是未来任何人的代码。

     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();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-01
      • 2020-12-22
      • 2018-02-02
      相关资源
      最近更新 更多