Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 服务器B上的进程文件(位于服务器A上)_Java_Spring Boot - Fatal编程技术网

Java 服务器B上的进程文件(位于服务器A上)

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

由于服务器A和服务器B没有SFTP,我正在尝试在服务器B上实现一个web服务,它在服务器A上获取文件并对其进行处理。我尝试使用SpringBoot来实现这一点,比如先保存文件,然后再保存进程。但是这种方式看起来像是异步的,这意味着当代码试图处理文件时,文件还没有准备好(当我打印文件位置时确认,它返回null)。处理这个问题的好方法是什么

控制器的当前代码如下:

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;
    }
}