我按照这个帖子上传了一个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(文件名,目录名或卷标语法不正确)。
有人可以帮我理解路径有什么问题以及它为什么将其转换为文件:\ ...?
答案 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
,因为fileToUpload
和fileToUpload.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解析依赖项。
此approch的问题:FileUtils
将从指定的URL下载文件,然后复制到指定的文件(您可以在项目的文件浏览器中找到index.html);这可能会导致大文件出现问题。
答案 2 :(得分:0)
答案 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。我的回答可能不完整,我很乐意随时编辑它。