如何在 Spring 引导中公开可下载的资源 link

How to expose an resource like downloadable link in Spring boot

实际上我有一个 spring 启动服务器,资源文件夹 (src/main/resources/public/myfilefolder/myfiles.apk) 中有许多文件。那么我的要求是用 cordova 文件传输库下载一个文件。我的第一个想法是将资源 link 直接放在组件中:

    var fileTransfer = new FileTransfer();
var fileURL =  "///storage/emulated/0/DCIM/myFile";
var uri = encodeURI("http://myserver/src/main/resources/public/myfilefolder/myfiles.apk");

fileTransfer.download(
    uri,
    fileURL,
    function(entry) {
        alert("download complete: " + entry.toURL());
    },
    function(error) {
        alert("download error source " + error.source);
        alert("download error target " + error.target);
        alert("download error code" + error.code);
    },
    false,
    {

      /*
        headers: {
            "Authorization": "Basic dGVzdHVzZXJuYW1lOnRlc3RwYXNzd29yZA=="
        }

        */
    }

但显然效果不佳,因为服务器认为它是控制器路由。有什么想法可以公开此资源以供下载吗?

你可以在springboot app中暴露一个get请求,你可以在其中传递你的文件名,它会根据输入下载文件,你可以根据你的应用要求添加下载限制。

@GetMapping("/downloadResource")
public ResponseEntity<ByteArrayResource> downloadResource(
        @RequestParam(defaultValue = DEFAULT_FILE_NAME) String fileName) throws IOException {

    MediaType mediaType = MediaTypeUtils.getMediaTypeForFileName(this.servletContext, fileName);

    MediaType mediaType = // Get media type of file
    System.out.println("fileName: " + fileName);
    System.out.println("mediaType: " + mediaType);

    Path path = Paths.get(DIRECTORY + "/" + DEFAULT_FILE_NAME);
    byte[] data = Files.readAllBytes(path);
    ByteArrayResource resource = new ByteArrayResource(data);

    return ResponseEntity.ok()
            // Content-Disposition
            .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + path.getFileName().toString())
            // Content-Type
            .contentType(mediaType) //
            // Content-Lengh
            .contentLength(data.length) //
            .body(resource);
}

终于明白了。感谢您的回答,这是我的解决方案:

在您的 spring 引导服务器中,您需要此方法:

@GetMapping(value="/file_download",

produces = MediaType.APPLICATION_OCTET_STREAM_VALUE
  )
@ResponseBody
public FileSystemResource downloadFile(@RequestParam String filename) throws IOException{

//to consume http://youserver/file_download?filename=mytest

try{


  System.out.println("in file download " +filename);

   String path = "src/main/resources/public/makingAPK/"+filename+"/"+filename+".apk"; //path of your file


    return new FileSystemResource(new File(path));
}

catch(Exception e){System.out.println("error in file_download "+e); return null;}

}

并在您的 cordova 插件传输中:

$scope.DownloadFileFromServer = function(url){ //file server location


   var fileURL =  "/storage/emulated/0/DCIM/thefile.apk";

try{

var fileTransfer = new FileTransfer();
var uri = encodeURI("http://yourserver/yourCtrlName/file_download?filename=yourfilename");

fileTransfer.download(
    uri,
    fileURL,
    function(entry) {
        alert("download complete: " + entry.toURL());
    },
    function(error) {
        alert("download error source " + error.source);
        alert("download error target " + error.target);
        alert("download error code" + error.code);
    },
    false,
    {

      /*
        headers: {
            "Authorization": "Basic dGVzdHVzZXJuYW1lOnRlc3RwYXNzd29yZA=="
        }

        */
    }
);