NSURLConnection de télécharger de gros fichiers (>40 MO)
J'ai besoin de télécharger de gros fichiers (> 40) de mon application à partir du serveur, ce fichier sera ZIP ou PDF. Je l'ai réalisé à l'aide de NSURLConnection, qui fonctionne bien que si le fichier est plus petit, l'autre sage téléchargement d'une partie de la remplir et de l'exécution de l'arrêté. pour exemple, j'ai essayé de télécharger 36 MO fichier PDF, mais seulement 16 mo de téléchargement. svp aider moi pour connaître la raison? comment résoudre ce problème?
FYI:
La Mise En Œuvre De Fichier
#import "ZipHandlerV1ViewController.h"
@implementation ZipHandlerV1ViewController
- (void)dealloc
{
[super dealloc];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
- (void)viewDidLoad
{
UIView *mainView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 400, 400)];
[mainView setBackgroundColor:[UIColor darkGrayColor]];
UIButton *downloadButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[downloadButton setFrame:CGRectMake(50, 50, 150, 50)];
[downloadButton setTitle:@"Download File" forState:UIControlStateNormal];
[downloadButton addTarget:self action:@selector(downloadFileFromURL:) forControlEvents:UIControlEventTouchUpInside];
[mainView addSubview:downloadButton];
[self setRequestURL:@"http://www.mobileveda.com/r_d/mcps/optimized_av_allpdf.pdf"];
[self.view addSubview:mainView];
[super viewDidLoad];
}
- (void)viewDidUnload
{
[super viewDidUnload];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
-(void) setRequestURL:(NSString*) requestURL {
url = requestURL;
}
-(void) downloadFileFromURL:(id) sender {
NSURL *reqURL = [NSURL URLWithString:url];
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:reqURL];
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
webData = [[NSMutableData data] retain];
} else {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error !" message:@"Error has occured, please verify internet connection" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
[alert show];
[alert release];
}
}
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
[webData setLength:0];
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[webData appendData:data];
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSString *fileName = [[[NSURL URLWithString:url] path] lastPathComponent];
NSArray *pathArr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *folder = [pathArr objectAtIndex:0];
NSString *filePath = [folder stringByAppendingPathComponent:fileName];
NSURL *fileURL = [NSURL fileURLWithPath:filePath];
NSError *writeError = nil;
[webData writeToURL: fileURL options:0 error:&writeError];
if( writeError) {
NSLog(@" Error in writing file %@' : \n %@ ", filePath , writeError );
return;
}
NSLog(@"%@",fileURL);
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error !" message:@"Error has occured, please verify internet connection.." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
[alert show];
[alert release];
}
@end
Fichier D'En-Tête:
#import <UIKit/UIKit.h>
@interface ZipHandlerV1ViewController : UIViewController {
NSMutableData *webData;
NSString *url;
}
-(void) setRequestURL:(NSString*) requestURL;
@end
Merci,
Mise à jour:
Cela arrive à cause de mon fichier téléchargeable a été dans l'hébergement mutualisé qui, ayant le téléchargement des limites. Après que j'ai déplacé le fichier de serveur dédié qui fonctionne bien. et aussi j'ai essayé de télécharger d'autres fichiers comme des vidéos de certains autres sites, qui travaille aussi bien.
Donc, si vous rencontrez des problème comme le téléchargement partiel, n'est pas seulement coller avec le code, vérifiez que le serveur trop
Vous devez vous connecter pour publier un commentaire.
Vous êtes actuellement en gardant toutes les données téléchargées dans un NSMutableData objet, qui est conservé dans la mémoire RAM de votre appareil. Qui, selon l'appareil et la mémoire disponible, à un certain point de déclencher un avertissement de mémoire ou encore d'un accident.
Pour obtenir des téléchargements importants pour le travail, vous aurez à écrire toutes les données téléchargées directement sur le système de fichiers.
J'ai eu le même problème, et il semble que j'ai découvert une solution.
Dans votre fichier d'en-tête de déclarer:
Dans votre .m fichier sur
downloadFileFromURL
lorsque vous obtenez la connexion de lancer le NSFileHandle:puis dans
didReceiveData
au lieu d'ajout de données dans la mémoire de l'écrire sur le disque, comme ceci:une fois le téléchargement terminer sur
connectionDidFinishLoading
ajouter ces lignes à écrire sur le fichier et à la libération de la connexion:Je suis en train en ce moment, espérons que cela fonctionne..
Cela arrive à cause de mon fichier téléchargeable a été dans l'hébergement mutualisé qui, ayant le téléchargement des limites. Après que j'ai déplacé le fichier de serveur dédié qui fonctionne bien. et aussi j'ai essayé de télécharger d'autres fichiers comme des vidéos de certains autres sites, qui travaille aussi bien.
Donc, si vous rencontrez des problème comme le téléchargement partiel, n'est pas seulement coller avec le code, vérifiez que le serveur aussi.
Si vous êtes prêt à utiliser asi-http-request, c'est beaucoup, beaucoup plus facile.
Découvrez https://github.com/steipete/PSPDFKit-Demo pour un exemple de travail avec l'asi.
C'est aussi simple que cela: