Java 服务器B上的进程文件(位于服务器A上)
由于服务器A和服务器B没有SFTP,我正在尝试在服务器B上实现一个web服务,它在服务器A上获取文件并对其进行处理。我尝试使用SpringBoot来实现这一点,比如先保存文件,然后再保存进程。但是这种方式看起来像是异步的,这意味着当代码试图处理文件时,文件还没有准备好(当我打印文件位置时确认,它返回null)。处理这个问题的好方法是什么 控制器的当前代码如下:Java 服务器B上的进程文件(位于服务器A上),java,spring-boot,Java,Spring Boot,由于服务器A和服务器B没有SFTP,我正在尝试在服务器B上实现一个web服务,它在服务器A上获取文件并对其进行处理。我尝试使用SpringBoot来实现这一点,比如先保存文件,然后再保存进程。但是这种方式看起来像是异步的,这意味着当代码试图处理文件时,文件还没有准备好(当我打印文件位置时确认,它返回null)。处理这个问题的好方法是什么 控制器的当前代码如下: package com.example.filedemo.controller; import com.example.filedem
package com.example.filedemo.controller;
import com.example.filedemo.payload.UploadFileResponse;
import com.example.filedemo.service.FileStorageService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import javax.servlet.http.HttpServletRequest;
import javax.xml.ws.Response;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@RestController
public class FileController {
private static final Logger logger = LoggerFactory.getLogger(FileController.class);
private static final String PYTHON_FILE = "V:/speechRecognition/audio_transcribe.py";
@Autowired
private FileStorageService fileStorageService;
@PostMapping("/uploadFile")
public UploadFileResponse uploadFile(@RequestParam("file") MultipartFile file) {
String fileName = fileStorageService.storeFile(file);
String fileDownloadUri =
ServletUriComponentsBuilder.fromCurrentContextPath().path("/downloadFile/").path(fileName).toUriString();
return new UploadFileResponse(fileName, fileDownloadUri, file.getContentType(), file.getSize());
}
@PostMapping("/processFile")
public ResponseEntity<String> processFile(@RequestParam("file") MultipartFile file) throws IOException {
String filename = uploadFile(file).getFileName();
File actualFile = new File("E:\\Audio\\uploads\\" + filename);
String fetching = "python " + PYTHON_FILE + " " + actualFile.getAbsolutePath();
String[] command = new String[] {"cmd.exe", "/c", fetching};
Process p = Runtime.getRuntime().exec(command);
String pythonPath = System.getProperty("PYTHON_PATH");
System.out.println("pythonPath is " + pythonPath);
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String ret = in.readLine();
System.out.println(ret);
return new ResponseEntity<String>("Success", HttpStatus.OK);
}
}
UploadFileResponse
package com.example.filedemo.payload;
public class UploadFileResponse {
private String fileName;
private String fileDownloadUri;
private String fileType;
private long size;
public UploadFileResponse(String fileName, String fileDownloadUri, String fileType, long size) {
this.fileName = fileName;
this.fileDownloadUri = fileDownloadUri;
this.fileType = fileType;
this.size = size;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getFileDownloadUri() {
return fileDownloadUri;
}
public void setFileDownloadUri(String fileDownloadUri) {
this.fileDownloadUri = fileDownloadUri;
}
public String getFileType() {
return fileType;
}
public void setFileType(String fileType) {
this.fileType = fileType;
}
public long getSize() {
return size;
}
public void setSize(long size) {
this.size = size;
}
}
我建议将文件存储在数据库中,然后从那里对其进行操作。显然,请注意文件大小不会超过列大小
如果您的操作需要磁盘上的实际文件(而不是字节流),那么您可以创建一个同步服务,轮询数据库以查找新文件,并在找到副本时将副本保存在本地磁盘上。然后,您的处理代码可以使用本地磁盘文件句柄。请向我们提供您自己已经尝试过的代码,否则这只会获得否决票,没有应答更新控制器的代码,或者以其他方式不保存到DB?因为服务器A可能无法访问数据库。上载是否在服务器A上进行?或者服务器A只是文件的源,而服务器B需要复制并处理它们?文件是否可以放置在B装载的共享驱动器上,以便文件看起来是本地的?是的,服务器a包含源文件,服务器B需要以某种方式获取该文件并对其进行处理。对于共享驱动器,我尝试了,但由于访问被拒绝而失败文件如何从服务器A传输到服务器B?您是否从服务器A通过/uploadFile端点将其上载到B?或者你是从A下载到你的桌面,然后上传到B?如果您是从下载到您的桌面,您使用什么方法下载?SFTP?SCP?HTTP?文件将在服务器A中生成,一旦生成文件,它将传递给服务器B进行处理。是的,我以为在服务器A上调用
/processFile
就可以完成所有的事情,但看起来情况并非如此。同时我不知道我们是否可以使用SFTP
package com.example.filedemo.payload;
public class UploadFileResponse {
private String fileName;
private String fileDownloadUri;
private String fileType;
private long size;
public UploadFileResponse(String fileName, String fileDownloadUri, String fileType, long size) {
this.fileName = fileName;
this.fileDownloadUri = fileDownloadUri;
this.fileType = fileType;
this.size = size;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getFileDownloadUri() {
return fileDownloadUri;
}
public void setFileDownloadUri(String fileDownloadUri) {
this.fileDownloadUri = fileDownloadUri;
}
public String getFileType() {
return fileType;
}
public void setFileType(String fileType) {
this.fileType = fileType;
}
public long getSize() {
return size;
}
public void setSize(long size) {
this.size = size;
}
}