Java - 使用远程文件的multipart / form-data POST请求(使用http://或file:// protocols)

时间:2017-07-23 09:58:16

标签: java http

我按照这个帖子上传了一个multipart / form-data文件: how-can-i-make-a-multipart-form-data-post-request-using-java。 但是,我无法找到有关从远程服务器上传文件的任何信息。 例如,假设我有一个文件: 文件://serverIP/folder/subFolder/file.x 我也可以使用http访问该文件: http://serverIP/subFoler/file.x

这是我的代码:

File fileToUpload = new File("file://serverIP/folder/subFolder/file.x");
    HttpPost request = new HttpPost(fullUri);
    HttpEntity multipart = MultipartEntityBuilder.create()
                        .addTextBody("field1", "yes", ContentType.TEXT_PLAIN)
                        .addBinaryBody("file", fileToUpload, ContentType.APPLICATION_OCTET_STREAM, fileToUpload.getName())
                        .build();
    request.setEntity(multipart);

执行后我得到 java.io.FileNotFoundException:file:\ serverIP \ folder \ subFolder \ file.x(文件名,目录名或卷标语法不正确)。

有人可以帮我理解路径有什么问题以及它为什么将其转换为文件:\ ...?

4 个答案:

答案 0 :(得分:0)

file:之后放置的斜杠数取决于主机(在您的情况下是远程服务器IP' s)os环境。例如,在Windows中,它通常可以file://,但对于unix环境,它是file:///new File(URI)仅适用于本地系统中的文件,因为只有那些文件适用于使用file:格式访问。

另一方面,想法保持不变,您需要在tmp本地路径下载远程URL对应的远程文件,然后使用该tmp文件构建http请求。您可以使用FileUtils#copyURLToFile

File fileToUpload = new File(_some tmp path_);    
FileUtils.copyURLtoFile(remoteFileUrl, fileToUpload);

这也不会改变您的http-entity,因为fileToUploadfileToUpload.getName()仍然保持不变

P.S。:删除此临时文件时要小心a.k.a fileToUpload

答案 1 :(得分:0)

你可以试试这个......

import java.io.File;
import java.io.IOException;
import java.net.URL;
import org.apache.commons.io.FileUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class Post_Remote_File {

    private static final String POST_URL = "http://127.0.0.1/post-demo/post-receiver.php";

    public static void main(String[] args) throws IOException {

        File fileToUpload = new File("index.html");
        FileUtils.copyURLToFile(new URL("http://127.0.0.1/post-demo/index.html"), fileToUpload);
        HttpPost request = new HttpPost(POST_URL);
        HttpEntity multipart = MultipartEntityBuilder.create()
                .addTextBody("field1", "yes", ContentType.TEXT_PLAIN)
                .addBinaryBody("file", fileToUpload, ContentType.APPLICATION_OCTET_STREAM, fileToUpload.getName())
                .build();
        request.setEntity(multipart);
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = httpClient.execute(request);
        //int code = response.getStatusLine().getStatusCode();
        ResponseHandler<String> handler = new BasicResponseHandler();
        String body = handler.handleResponse(response);
        //HttpEntity responseEntity = response.getEntity();
        System.out.println(body);

    }
}

使用HttpComponents Core,HttpComponents Client(来自Apache HttpComponents),Commons Logging,Commons IO(来自Apache Commons)和Apache HttpClient Mime所以请确保这些在执行之前存在于类路径中(这就是我在这里粘贴完整代码的原因)。下面是此项目的库资源管理器视图,或使用Maven解析依赖项。

enter image description here

此approch的问题:FileUtils将从指定的URL下载文件,然后复制到指定的文件(您可以在项目的文件浏览器中找到index.html);这可能会导致大文件出现问题。

答案 2 :(得分:0)

答案是非常愚蠢的,但它对我有用的唯一方法是添加file:/// / (四个反斜杠),并将URI转换为\\ serverIP \文件夹\的子文件夹\ file.x

答案 3 :(得分:0)

首先要做的是:您在尝试访问哪些服务器?这是因为:

  

前缀概念用于处理UNIX平台上的根目录,以及Microsoft Windows平台上的驱动器说明符,根目录和UNC路径名(来自Oracle Java文档)

有点不同。 有关提示,您可以查看there。接下来就是这一行:

File fileToUpload = new File("file://serverIP/folder/subFolder/file.x");

如果它是linux服务器,那么这应该足以访问该文件:

File fileToUpload = new File("serverIP:/here_comes_your_absolute_path");

对于&#34; windows&#34;服务器它应该是如下所示:

File fileToUpload = new File("\\\\serverIP\\here\\comes\\yourpath\\file.txt")

P.S。我的回答可能不完整,我很乐意随时编辑它。