当前位置: 首页 > 知识库问答 >
问题:

在Spring中使用RestTemplate将MultipartFile+String作为请求

陆洛城
2023-03-14

在我的Spring Boot应用程序中,我需要将String值与MultipartFile一起作为RequestParam传递。Controller在下面,我将MultipartFile转换为java.io.file,然后在RestTemplate的帮助下将其传递给DAO Controller。

来自Angular的请求将首先命中Upload Controller,然后UploadController是客户端(Java),它将使用基URL调用服务器svs-ba-dao Controller。csvupload包含基本URL:http://localhost:8082/svs-ba-dao/csvupload?parentpkid=&file=multipartfile

@CrossOrigin
@RestController
public class UploadController {

    private static final Logger log = LogManager.getLogger(UploadController.class);

    @Value("${salama.dao.csvUpload.rest.url}")
    private String csvUpload;
    
    @Autowired
    UploadHelperService uploadHelperService;
    
    @PostMapping(value = "/csvUpload")
    public String csvUpload(@QueryParam("parentPkId") String parentPkId, @RequestParam("file") MultipartFile file ) throws IllegalStateException, IOException{
        
        log.info("Calling csvUpload :" + csvUpload);
        final HttpHeaders requestHeaders = new HttpHeaders();
        requestHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);

        File cnvFile = uploadHelperService.multipartToFile(file,file.getOriginalFilename());
        System.out.println("Converted File Name is -->"+cnvFile.getName());
        final MultiValueMap<String, Object> data = new LinkedMultiValueMap<>();
        
        data.add("parentPkId", parentPkId);
        data.add("file", new FileSystemResource(cnvFile));
        
    HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String, Object>>(data, requestHeaders);
    
        RestTemplate restTemplate = new RestTemplate();
        
        ResponseEntity<String> obj =restTemplate.exchange(csvUpload, HttpMethod.POST,
            requestEntity, String.class);
        
        return obj.getBody();
}
    
    
}

在svs-ba-dao控制器中捕获它,如下所示

@RequestMapping(value="/csvUpload", method=RequestMethod.POST)
    public String csvUpload(@RequestParam String parentPkId, @RequestParam MultipartFile file) throws IOException {
        log.info("Entered method csvUpload() of svs-ba-dao.class");
        return uploadService.csvUpload(parentPkId,file);
    }

我已将这些属性包含到应用程序的application.properties文件中:spring.servlet.multipart.maxfilesize=1MBspring.servlet.multipart.maxrequestsize=1MB

因此,我启动应用程序并调用生成POST请求的/csvupload。我得到了低于误差。

Converted File Name is -->testInput_TxnMpMotSlv.csv
2019-01-24T15:12:41,217 ERROR [[localhost].[/svs-ba-dao].[dispatcherServlet]] [http-nio-8085-exec-2] Servlet.service() for servlet [dispatcherServlet] in context with path [/svs-ba-dao] threw exception [Request processing failed; nested exception is org.springframework.web.client.HttpServerErrorException: 500 null] with root cause
org.springframework.web.client.HttpServerErrorException: 500 null
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:97) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:79) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
    at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:766) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:724) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:680) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:600) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
    at com.svs-ba-dao.controller.UploadController.csvUpload(UploadController.java:59) ~[classes/:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_192]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_192]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_192]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_192]

resttemplate中存在错误,因为它取null,但是调用resttemplate的语法方法是正确的,因为我没有得到任何错误。通过传递requestparam值,我是否正确地调用了基URL.即parentpkid=?&file=multipartfile

http://localhost:8082/svs-ba-dao/csvupload?parentpkid=&file=multipartfile
老实说,我以前没有做过这方面的工作。如果我做错了,欢迎任何线索或改正。提前致谢

共有1个答案

燕玉堂
2023-03-14

在这里我发现了我错的地方

csvUpload将保存应在rest模板中传递的URL

 @Value("${salama.dao.csvUpload.rest.url}")
        private String csvUpload;

我发现从UploadController发送的基本URL:即csvUploadhttp://localhost:8082/svs-ba-dao/csvUpload?parentpkid=&file=multipartfile错误。

以下是我更新的基本URL:http://localhost:8082/svs-ba-dao/csvupload?parentpkid=&file=

 类似资料:
  • 我在请求体中以multipart/form-data的形式发送file.json,我希望读取文件的内容并将其存储为字符串。

  • 我在一个J2EE Web应用程序上使用Spring MVC。 我创建了一个方法,它将请求主体绑定到一个类似于上面的模型 一切都工作得很好,当我在MyEntityForm中包含MultipartFile类型的属性时,我必须使用内容类型“multiPart/form-data”发出请求。 此外,在这个场景中一切都工作得很好。 我面临的问题是,我希望将MultipartFile属性设置为可选的。 当客户

  • 我将调用一个POST REST API,它在其主体中接受一个文件。 如果我发送几个KB的文件(使用下面的代码),大约需要300毫秒。如果我发送大约5 GB的文件,它会抛出内存异常。 是否有一种可能的方法可以按顺序将文件作为块发送?目前,我们正在避免任何并行处理。 非常感谢您在代码或参考方面的任何帮助。

  • 我一直在尝试将文件从rest客户端发送到我的spring控制器。在控制器中,我使用“@requestParam(“file”)MultipartFile file”从客户端获取文件,并使用REST服务注释进行注释,如下所示 我总是得到415媒体类型不支持。在上面的方法中,如果我不给多部分,它给我的结果是完成了,但不是多部分。 所以我可以知道如何发送文件到我的Spring控制器?

  • 我的项目中有一个常见的Spring云架构:用于服务发现的eureka、作为反向代理的zuul和一些微服务。我希望能够通过编程从zuul访问微服务。由于zuul由Ribbon支持,我只想自动连接一个,但显然这不起作用。下面是我的小测试设置。 Zulgateway应用程序。爪哇: 有些ervice.java: 下面是stackTrack的相关部分: 我是否需要配置其他东西来获得正确的?我还尝试用注释M

  • 问题内容: 如何gzip HTTP 请求 ,由创建 我正在使用Spring (Java SE,而不是Web浏览器中的Android或Javascript)。 我正在提出一些非常大的请求,并且我希望压缩 请求正文 。 问题答案: 我提出了两种解决方案,一种更简单,无需流传输,另一种支持流传输。 如果您 不需要流式传输 ,请使用custom ,一个Spring功能。 可能在哪里: 我复制了 配置拦截器