Java 如何使用Spring以编程方式使用RESTAPI中的文件?

Java 如何使用Spring以编程方式使用RESTAPI中的文件?,java,spring,rest,Java,Spring,Rest,我有下面的Rest资源,它从DB下载一个文件。它在浏览器中运行良好,但是,当我尝试在Java客户机上执行以下操作时,得到406(不接受错误) 我在这里遗漏了什么?也许可以尝试一下,改变一下你的休息方式: public javax.ws.rs.core.Response downloadActivityJar(@PathVariable String name) throws IOException { byte[] file = IOUtils.toByteArray(artifactR

我有下面的Rest资源,它从DB下载一个文件。它在浏览器中运行良好,但是,当我尝试在Java客户机上执行以下操作时,得到406(不接受错误)


我在这里遗漏了什么?

也许可以尝试一下,改变一下你的休息方式:

public javax.ws.rs.core.Response downloadActivityJar(@PathVariable String name) throws IOException {
    byte[] file = IOUtils.toByteArray(artifactRepository.downloadJar(name));
    return Response.status(200).entity(file).header("Content-Disposition", "attachment; filename=\"" + name + ".jar\"").build();
}
另外,使用类似这样的方法下载文件,这样做是错误的

org.apache.commons.io.FileUtils.copyURLToFile(new URL("http://localhost:8080/activities/download/" + message.getActivity().getName()), new File("locationOfFile.jar"));

您需要告诉它将文件保存到哪里,我认为REST API不会为您这样做。

尝试使用RestTemplate上的execute方法和ResponseExtractor,并使用extractor从流中读取数据。

响应代码为406不接受。 您需要指定一个“Accept”请求头,该头必须与RequestMapping的“Products”字段匹配

RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new ByteArrayHttpMessageConverter());    
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM));
HttpEntity<String> entity = new HttpEntity<String>(headers);

ResponseEntity<byte[]> response = restTemplate.exchange(URI, HttpMethod.GET, entity, byte[].class, "1");

if(response.getStatusCode().equals(HttpStatus.OK))
        {       
                FileOutputStream output = new FileOutputStream(new File("filename.jar"));
                IOUtils.write(response.getBody(), output);

        }
RestTemplate RestTemplate=new RestTemplate();
restemplate.getMessageConverters().add(新的ByteArrayHttpMessageConverter());
HttpHeaders=新的HttpHeaders();
setAccept(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM));
HttpEntity=新的HttpEntity(标题);
ResponseEntity response=restemplate.exchange(URI,HttpMethod.GET,entity,byte[].class,“1”);
if(response.getStatusCode().equals(HttpStatus.OK))
{       
FileOutputStream输出=新的FileOutputStream(新文件(“filename.jar”));
写入(response.getBody(),输出);
}

一个小警告:不要对大文件执行此操作。exchange(…)总是将整个响应加载到内存中,这样您就可以避免内存异常。为了避免这种情况,不要使用Spring RestTemplate,而是直接使用Java标准的HttpUrlConnection或apache http组件。

您可以将InputStreamResource与ByteArrayInputStream一起使用

@RestController
public class SomeController {
    public ResponseEntity<InputStreamResource> someResource() {
         byte[] byteArr = ...;
         return ResponseEntity.status(HttpStatus.OK).body(new InputStreamResource(new ByteArrayInputStream(byteArr)));
    }
}
@RestController
公共类控制器{
公共响应某些资源(){
字节[]byteArr=。。。;
返回ResponseEntity.status(HttpStatus.OK).body(新的InputStreamResource(新的ByteArrayInputStream(byteArr)));
}
}

使用此选项可使用exchange下载JPEG图像。这很好用

URI uri = new URI(packing_url.trim());

HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.IMAGE_JPEG));
HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);

// Send the request as GET
ResponseEntity<byte[]> result= template.exchange(uri, HttpMethod.GET, entity, byte[].class);

out.write(result.getBody());
URI=newuri(packing_url.trim());
HttpHeaders=新的HttpHeaders();
setAccept(Arrays.asList(MediaType.IMAGE_JPEG));
HttpEntity=新的HttpEntity(“参数”,标题);
//将请求作为GET发送
ResponseEntity result=template.exchange(uri,HttpMethod.GET,entity,byte[].class);
out.write(result.getBody());

这些文件会很大吗?我建议将其流式传输,而不是将所有字节加载到数组中并发送back@TritonMan文件大小约为90Kb,因此没有那么大。不确定这是否有用,但我的团队刚刚开始对我们的rest调用使用改进。基本上,您可以定义一个带注释的接口,然后可以像调用任何其他方法一样进行rest调用。改型在后台处理所有细节:我在尝试使用File.class
时遇到此错误无法提取响应:没有为响应类型[class java.io.File]和内容类型[application/octet stream]找到合适的HttpMessageConverter
此参数究竟代表什么,在文档中找不到任何信息。此解决方案无效-响应包含整个字节数组,这意味着您刚刚将所有内容加载到内存中,接下来要做的是将其流式传输到文件输出流。这可能会导致OutOfMemoryError!要查看更大的文件,请签出。但我不会在这些情况下使用RestTemplate,而是直接使用HttpUrlConnection或ApacheHTTP组件。我不明白为什么会投反对票。这是一个正确的答案。FileUtils.copyURLToFile()只用一行代码就解决了这个问题。简短而甜蜜的回答您有使用ResponseExtractor的示例吗?@alltej没有。
@RestController
public class SomeController {
    public ResponseEntity<InputStreamResource> someResource() {
         byte[] byteArr = ...;
         return ResponseEntity.status(HttpStatus.OK).body(new InputStreamResource(new ByteArrayInputStream(byteArr)));
    }
}
URI uri = new URI(packing_url.trim());

HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.IMAGE_JPEG));
HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);

// Send the request as GET
ResponseEntity<byte[]> result= template.exchange(uri, HttpMethod.GET, entity, byte[].class);

out.write(result.getBody());