gpt4 book ai didi

java - 如何将通用文件发送到 Jersey 服务并正确接收?

转载 作者:搜寻专家 更新时间:2023-11-01 01:56:04 24 4
gpt4 key购买 nike

我正在开发一个使用 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只是垃圾,打不开后者。您应该仔细检查您上传和保存的文本文件的内容是否与原始文件相同。

关于java - 如何将通用文件发送到 Jersey 服务并正确接收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8783184/

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