如何在 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=="
}
*/
}
);
实际上我有一个 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=="
}
*/
}
);