【发布时间】:2021-04-12 12:02:52
【问题描述】:
我需要从远程位置读取所有文件并将其发送到另一个服务,如果发送成功,则删除所有文件。我的代码对单个文件运行良好,但如果我想循环读取所有文件,则代码不会被执行。
请找到如下代码。在 RemoteFileReadImpl 类中,我正在尝试读取不起作用的循环文件。在 WebClientUtil 类中,我将文件发送到另一个服务。返回成功响应后,我想重命名已读取的文件。
package com.remotefileread.serviceImpl;
import java.io.IOException;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
public class WebClientUtil{
WebClient webClient = WebClient.create("http://localhost:9091");
public Mono<HttpStatus> ftpFileSend(MultipartFile fileData) {
MultiValueMap<String,Object> body=new LinkedMultiValueMap<String,Object>();
try {
body.add("file", fileData.getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return webClient
.post()
.uri("/storeFileData")
.contentType(MediaType.MULTIPART_FORM_DATA)
.body(BodyInserters.fromMultipartData(body))
.exchange()
.map(response -> {
return response.statusCode();
});
}
}
package com.remotefileread.serviceImpl;
import java.io.File;
import java.io.FileInputStream;
import java.nio.file.Files;
import java.util.Base64;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.reactive.function.server.ServerResponse;
import com.remotefileread.model.SendFileData;
import com.remotefileread.service.RemoteFileRead;
import reactor.core.publisher.Mono;
@Service
public class RemoteFileReadImpl implements RemoteFileRead{
@Autowired
WebClientUtil webClientUtil;
public Mono<ServerResponse> ftpFileRead() {
File directoryPath = new File("\\\\localhost\\SharedFolder\\csv_container");
File files[] = directoryPath.listFiles();
try {
for(File csvFile : files) {
SendFileData fileData=new SendFileData();
byte[] content = Files.readAllBytes(csvFile.toPath());
fileData.setFilename(csvFile.getName());
fileData.setFileContent(Base64.getEncoder().encodeToString(content));
fileData.setCustomerName("Cust");
FileInputStream input = new FileInputStream(csvFile);
MultipartFile multipartFile = new MockMultipartFile("file",
csvFile.getName(),"text/plain",IOUtils.toByteArray(input));
input.close();
Mono<HttpStatus> monoStatus = webClientUtil.ftpFileSend(multipartFile);
monoStatus
.doOnSuccess( httpStatus ->
{
System.out.println("Http Status:" + httpStatus);
})
.doOnError(error ->
{
System.out.println("Http Status:" + error);
});
}
return ServerResponse.ok().contentType(MediaType.TEXT_PLAIN).bodyValue("OK");
}
catch(Exception ex) {
return ServerResponse.badRequest().contentType(MediaType.TEXT_PLAIN).bodyValue("Error Message: " + ex.getMessage());
}
}
}
【问题讨论】:
-
请查阅有关 webflux 的基本教程或查看projectreactor.io/docs/core/release/reference/#getting-started 在 webflux 中的编码与常规 java 有很大不同,您正在尝试在 webflux 中编写常规 java。
标签: spring spring-boot spring-webflux