Nativescript: как создать объект JS File из пути к файлу?

Я использую плагин nativescript-imagepicker для выбора изображений из галереи телефона. Одна из вещей, которую этот плагин позволяет мне получить, — это путь к файлу.

Мне нужно иметь возможность загрузить этот выбранный файл на сервер, используя данные формы. Для этого мне нужно сначала создать файловый объект.

Как я могу использовать путь к файлу для создания файлового объекта?

0
0
255
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для загрузки изображений из фотогалереи я настоятельно рекомендую использовать Фон Nativescript http. Чтобы загрузить изображения на сервер, вам нужно будет сохранить их в приложении, чтобы их можно было загрузить. Я следовал примеру, показанному здесь Загрузить пример.

После того, как вы сохранили изображения локально, если вам нужны дополнительные данные, вам нужно будет использовать multipartUpload и создать запрос, который будет выглядеть примерно так.

let BackgroundHTTP = require('nativescript-background-http')
let session = BackgroundHTTP.session('some unique session id')
let request: {
    url: 'your.url.to/upload/images',
    method: 'POST',
    headers: {
        'Content-Type': 'application/octet-stream'
    }
    description: 'Uploading local images to the server'
}

//photos should have at least the filename from when you saved it locally.
let params = []
photos.forEach(photo => {
    params.push({name: photo.name, filename: photo.filename, value: 'ANY STRING DATA YOU NEED'})
}

let task = session.multipartUpload(params, request)

task.on('progress', evt => {
    console.info('upload progress: ' + ((evt.currentBytes / evt.totalBytes) * 100).toFixed(1) + '%')
}

task.on('error', evt => {
    console.info('upload error')
    console.info(evt)
}

task.on('complete', evt => {
    //this does not mean the server had a positive response
    //but the images hit the server.
    // use evt.responseCode to determine the status of request
    console.info('upload complete, status: ' + evt.responseCode)
}

Благодарю за ваш ответ. Я должен сказать, что не понимаю, почему мне нужно «сохранять изображение в приложении». Могу ли я просто создать объект File из существующего файла в галерее, как это можно сделать с помощью обычной HTML-формы?

i.brod 09.05.2019 03:24

@ sheff2k1 Я не уверен, почему нужна локальная копия. Я получил такой же путь к файлу, как и вы, и изо всех сил пытался что-нибудь загрузить. После нескольких дней борьбы и чтения похожих на этот github.com/NativeScript/nativescript-imagepicker/issues/221 вопросов я в итоге сделал то же, что и все остальные. Создание локальной копии кажется лучшим решением. По завершении загрузки я удаляю локальную фотографию, чтобы сэкономить место.

Shawn Pacarar 09.05.2019 17:24

У вас может не всегда быть доступ к исходному файлу при выборе галереи форм, поэтому рекомендуется записать его в файл, если вы хотите часто получать к нему доступ в своем приложении. Также вам следует использовать фоновый http-плагин, так как http-клиент по умолчанию не поддерживает многокомпонентную загрузку. Другой альтернативой является загрузка изображения в виде строки base64, если вы не хотите использовать фоновый http-плагин для загрузки.

Manoj 09.05.2019 20:31

Таким образом, мне удалось (более или менее) использовать метод session.uploadFile, как показано в стандартном примере (используя файл, существующий в моей галерее, без какой-либо специальной процедуры копирования файла). Но multipartUpload у меня просто не работает. let task = session.multipartUpload(params, request) ничего не возвращает и ничего не происходит. Я попытался глубоко погрузиться в код, и кажется, что он просто «ломается» в каком-то внутреннем вызове функции библиотеки без каких-либо ошибок. Вы действительно пытались запустить multipartUpload? сомневаюсь, что разрешения являются проблемой, потому что работает один файл

i.brod 10.05.2019 19:48

Я также добавлю, что эта странная вещь происходит, даже если я не использую какой-либо файл в массиве «params», а только некоторые стандартные поля.

i.brod 10.05.2019 19:52

LOL, хорошо, у меня возникла проблема: я использовал число вместо строки в своем дополнительном параметре. Жаль, что плагин не выдает никаких ошибок, это сэкономило бы много потерянного времени :D. Извините, что бомбил вас этим :D

i.brod 10.05.2019 20:14

Другие вопросы по теме