如何将通用文件发送至球衣服务并正确接收?
我正在开发使用Dropbox API的Jersey服务。如何将通用文件发送至球衣服务并正确接收?
我需要发布一个通用文件到我的服务(该服务将能够管理每种文件以及您可以使用Dropbox API)。
客户端
所以,我已经实现了一个简单的客户端:
- 打开文件,
- 创建到URL的连接,
- 设置正确的HTTP方法,
- 创建一个
FileInputStream
并使用字节缓冲区将文件写入连接的输出流。
这是客户端测试代码。
public class Client {
public static void main(String args[]) throws IOException, InterruptedException {
String target = "http://localhost:8080/DCService/REST/professor/upload";
URL putUrl = new URL(target);
HttpURLConnection connection = (HttpURLConnection) putUrl.openConnection();
connection.setDoOutput(true);
connection.setInstanceFollowRedirects(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("content-Type", "application/pdf");
OutputStream os = connection.getOutputStream();
InputStream is = new FileInputStream("welcome.pdf");
byte buf[] = new byte[1024];
int len;
int lung = 0;
while ((len = is.read(buf)) > 0) {
System.out.print(len);
lung += len;
is.read(buf);
os.write(buf, 0, len);
}
}
}
服务器端
我有一个方法:
- 获得一个
InputStream
作为参数, - 创建一个与原始的相同名称和类型的文件文件。
以下代码实现了一个用于接收特定PDF文件的测试方法。
@PUT
@Path("/upload")
@Consumes("application/pdf")
public Response uploadMaterial(InputStream is) throws IOException {
String name = "info";
String type = "exerc";
String description = "not defined";
Integer c = 10;
Integer p = 131;
File f = null;
try {
f = new File("welcome.pdf");
OutputStream out = new FileOutputStream(f);
byte buf[] = new byte[1024];
int len;
while ((len = is.read(buf)) > 0)
out.write(buf, 0, len);
out.close();
is.close();
System.out.println("\nFile is created........");
} catch (IOException e) {
throw new WebApplicationException(Response.Status.BAD_REQUEST);
}
//I need to pass a java.io.file object to this method
professorManager.uploadMaterial(name, type, description, c,p, f);
return Response.ok("<result>File " + name + " was uploaded</result>").build();
}
此实现仅适用于文本文件。如果我尝试发送简单PDF,则收到的文件不可读(在将它保存到磁盘后)。
我该如何满足我的要求?任何人都可以提出解决方案
你是客户端代码有问题。
while ((len = is.read(buf)) > 0) {
...
is.read(buf);
...
}
你从InputStream
两次在每次迭代阅读。从循环体删除read
声明,你会没事的。
你也说过你的问题中提出的代码适用于文本文件。我认为这也行不通。从您尝试上传的文件中读取两次意味着您只上传了一半的内容。一半的文本文件仍然是一个文本文件,但是一半PDF只是垃圾,所以你不能打开后者。如果上传和保存的文本文件的内容与原始文件的内容相同,则应该进行双重检查。
你是对的!多么愚蠢的错误。现在它可以工作。 – pierus 2012-01-09 20:47:08
我借此机会问您另一个问题:我如何使用apache httpclient库实现相同的客户端功能? – pierus 2012-01-09 20:54:40
@pierus对不起,但我不熟悉Apache的HttpClient。但是,如果您要使用Jersey,那么我建议您使用[Jersey's Client API](http://jersey.java.net/nonav/documentation/latest/user-guide.html#d4e616),这是工具与泽西资源(任何其他RESTful界面作为事实的一个标准)进行交互。 – 2012-01-09 21:07:34
你能发布你的客户端和服务器代码吗?没有这一点,很难说出什么问题。 – 2012-01-09 06:35:07
感谢您的回应。我添加了一些代码。 – pierus 2012-01-09 10:15:42