iPhone - NSData do URL do arquivo local

85

Eu tenho um NSURLobjeto que me fornece o caminho de um arquivo local (na pasta de documentos). Quero preencher um NSDataobjeto com o conteúdo deste arquivo. Tentei usar, dataWithContentsOfURL:mas falhou. Eu sei que o arquivo existe porque o iPhone SDKretorna o caminho.

Alguém pode me dizer como posso obter um NSDataobjeto URLde um arquivo local?

Obrigado.

perdido em trânsito
fonte
O que significa "mas falha"?
Marco,
Significa que ele congela neste ponto! Dá uma exceção. Estou tentando acessar os dados de um vídeo, o URL que começa a partir de UIImagePickerController
lostInTransit
Parece que você está tentando passar um objeto que não é um NURL. Como você está obtendo o URL do arquivo, tem certeza de que é um URL e não um NSString?
Marco,
@AliKhaki: Por favor, não faça edições triviais, são necessárias duas pessoas na fila de revisão para examinar suas alterações. Se você editar uma pergunta para melhorá-la, sinta-se à vontade para remover coisas inúteis como "obrigado", mas não edite a pergunta apenas por isso. Obrigado!
Cris Luengo

Respostas:

163

Código Swift:

let data = FileManager.default.contents(atPath: path)
Tim
fonte
1
contentsOfFile recebe um NSString com o caminho do arquivo. Estou recebendo um objeto NSURL.
lostInTransit,
Não tenho certeza, mas, usando defaultManager em vez de alloc, o init pode causar problemas de threading.
carlossless de
2
A documentação do NSFileManager tem a dizer sobre Threading Considerations: "Os métodos do objeto NSFileManager compartilhado podem ser chamados de vários threads com segurança." A única exceção que eles observam é se você pretende manipular retornos de chamada delegados das operações do gerenciador de arquivos; Não acredito que isso se aplique aqui.
Tim de
Observe que o caminho é 'Caminho completo' do arquivo, que você pode encontrar em Inspetor de arquivos do XCode
Burak
29

Para obter este trabalho, você só precisa fazer:

NSURL *imgPath = [[NSBundle mainBundle] URLForResource:@"search" withExtension:@"png"];
NSString*stringPath = [imgPath absoluteString]; //this is correct  

//you can again use it in NSURL eg if you have async loading images and your mechanism 
//uses only url like mine (but sometimes i need local files to load)
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:stringPath]];
UIImage *ready = [[[UIImage alloc] initWithData:data] autorelease];
Marcin Małysz
fonte
2

Certifique-se de que seu URL local comece com "file: //", então você só precisa fazer isso:

 NSData *fileData = [NSData dataWithContentsOfFile:fileURL.path];
ahbou
fonte
url é sempre retornado como biblioteca de ativos: //asset/asset.MOV? id = 095AA9E9-A4F5-4035-9A21-3CFF04F45C70 & ext = MOV @ahbou
Mansuu ....
Isso é válido apenas para Ativos (fotos e vídeos). O OP está perguntando sobre um arquivo da pasta de documentos
ahbou
quando eu crio um objeto de dados a partir do url selecionado para asset_library ele me dá zero @ahbou
Mansuu ....
Os ativos são manipulados apenas pela AssetsLibrary ou Photos.framework. Para recuperar um ativo, você precisa chamar asset.assetForURL {} Pesquise este método ou faça uma nova pergunta como este é um tópico separado.
ahbou de
0

Para swift3, achei a resposta do seguinte URL útil

(Eu estava seguindo o caminho, depois de capturar a imagem usando o plugin phonegap

arquivo: ///var/mobile/Containers/Data/Application/B64B06DE-7976-45CF-9BE2-661F0F309A06/tmp/abcded.jpg)

https://stackoverflow.com/a/41043447/6383908

se deixar videoURL = URL (string: urlString), deixe videodata = tentar? Data (contentsOf: videoURL) {// Adicione o código do Alamofire aqui}

Chirag Purohit
fonte
0
guard let data = FileManager.default.contents(atPath: path) else
    { ...
Anton Tropashko
fonte