Я искал повсюду, но не смог найти подходящего ответа для моего варианта использования. По сути, я хотел бы загрузить файл с кодировкой base64 (может быть pdf, pgn, jpeg - используя pdf в следующем примере) из моего бэкэнда, сохранить его в папку TEMPORARY
fileSystem, а затем открыть его - возможно, используя соответствующий приложение на устройстве, если оно есть. Пусть /file
будет маршрутом, обслуживаемым следующим контроллером ASP.NET MVC WebAPI:
public class FileController : ApiController
{
// POST api/file/
public HttpResponseMessage Post([FromBody]string fullPath)
{
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
var stream = new FileStream(fullPath, FileMode.Open);
result.Content = new StreamContent(stream);
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
return result;
}
}
Я придумал следующий скрипт AngularJS:
$scope.download = function(fileName) {
window.requestFileSystem(window.TEMPORARY, 1024*1024*500, function(fileSystem) {
fileSystem.root.getDirectory("TempDir", {create: true}, function(dirEntry) {
dirEntry.getFile(fileName, {create: true, exclusive: false}, function(fileEntry) {
$http.post("/file", JSON.stringify(fileName), {
headers: {Accept: "application/octet-stream"}
}).success(function(res) {
fileEntry.createWriter(function(fileEntryContent) {
var blob = new Blob([res], {type: "application/pdf"});
fileEntryContent.write(blob);
//Now load file
$scope.load(fileName);
});
}).error(function(err) {
console.warn(err);
});
}, function(err) {
console.warn("getFile failed:", err);
});
}, function(err) {
console.warn("getDirectory failed:", err);
});
}, function(err) {
console.warn("requestFileSystem failed:", err);
});
};
$scope.download("foo.pdf");
$scope.load = function(fileName) {
window.requestFileSystem(window.TEMPORARY, 1024*1024*500, function(fileSystem) {
fileSystem.root.getDirectory("TempDir", {create: false}, function(dirEntry) {
dirEntry.getFile(fileName, {create: false, exclusive: false}, function(fileEntry) {
//This is where the magic needs to happen!
}, function(err) {
console.warn("getFile failed:", err);
});
}, function(err) {
console.warn("getDirectory failed:", err);
});
}, function(err) {
console.warn("requestFileSystem failed:", err);
});
};
В настоящее время я топчусь на этапе загрузки: пробовал window.open
кодировать содержимое файла в кодировке base64, http.get
кодировать fileEntry.toURL()
, но, похоже, ничего не работает. Я проверил плагин Cordova File Opener 2, но оказалось, что он может открывать только файлы, хранящиеся на устройстве. SD-карта или что-то подобное. Любая подсказка приветствуется! Ваше здоровье.