2015-04-23 4 views
6

Ich habe ein Video, das mit AVCapture erfasst wurde, und ich versuche, mit AFNetworking mit Swift hochzuladen.Hochladen einer Datei von AVCapture mit AFNetworking

Code:

let manager = AFHTTPRequestOperationManager() 
let url = "http://localhost/test/upload.php" 
var fileURL = NSURL.fileURLWithPath(string: ViewControllerVideoPath) 
var params = [ 
    "familyId":locationd, 
    "contentBody" : "Some body content for the test application", 
    "name" : "the name/title", 
    "typeOfContent":"photo" 
] 

manager.POST(url, parameters: params, 
    constructingBodyWithBlock: { (data: AFMultipartFormData!) in 
     println("") 
     var res = data.appendPartWithFileURL(fileURL, name: "fileToUpload", error: nil) 
     println("was file added properly to the body? \(res)") 
    }, 
    success: { (operation: AFHTTPRequestOperation!, responseObject: AnyObject!) in 
     println("Yes thies was a success") 
    }, 
    failure: { (operation: AFHTTPRequestOperation!, error: NSError!) in 
     println("We got an error here.. \(error.localizedDescription)") 
}) 

Der obige Code fehlschlägt, ich erhalte immer

was file added properly to the body? false" 

beachten Sie, dass ViewControllerVideoPath eine Zeichenfolge ist, die Position des Videos enthält, die ist:

"/private/var/mobile/Containers/Data/Application/1110EE7A-7572-4092-8045-6EEE1B62949/tmp/movie.mov" 

mit println() .... Der obige Code funktioniert, wenn ich af hochlade ILE im Verzeichnis und mit eingeschlossen:

var fileURL = NSURL.fileURLWithPath(NSBundle.mainBundle().pathForResource("test_1", ofType: "mov")!) 

Also auf jeden Fall meines PHP-Code ist in Ordnung, und das Problem liegt bei, dass die Datei auf dem Gerät gespeichert hochladen, was ich falsch hier?

+0

Wie genau schlägt Ihr Upload-Code fehl? Ist das Hochladen absolut nichts oder auf andere Weise (Absturz etc.)? Haben Sie eine Überprüfung mit NSFileManager ausgeführt, um zu bestätigen, dass Ihre Datei existiert, bevor Sie den Upload starten? – Eugene

+0

@Eugene die Datei wird durch einen Player mit dem gleichen Pfad wiedergegeben ... Ich bekomme immer von PHP, "Datei zu Körper falsch hinzugefügt" .. – MasterWizard

+0

Scheint wie diese Fehlerantwort von Ihrem Backend wird von Ihnen manuell zurückgegeben. Erhält Ihr Backend die Datei? Wenn ja, haben Sie versucht, die Datei irgendwo auf der Backend-Festplatte zu schreiben, um zu sehen, ob die Datei richtig kodiert ist und von Ihrem Media Player gelesen werden kann? – Eugene

Antwort

2

Kommentare erlauben keine vollständige Erklärung, also hier ist mehr Info;

NSBundle.mainBundle() verweist auf einen Pfad in der Bundle-Datei Der Pfad im Simulator unterscheidet sich von dem der Anwendung ... dies ist nicht das, was Sie wollen. Es gibt eine Reihe von "Ordnern", auf die Sie basierend auf Ihren Anforderungen zugreifen können (private oder gemeinsam nutzbare/Dateien, die in die Cloud gesichert werden können). NSPathUtils.h gibt eine Aufschlüsselung der verfügbaren Pfade. In Übereinstimmung mit den Konventionen, die von den meisten verwendet werden, sollten Sie wahrscheinlich einen privaten Pfad unter Ihrem Anwendungspfad erstellen, indem Sie etwas wie;

- (NSURL *) applicationPrivateDocumentsDirectory{ 
    NSURL *pathURL = [[self applicationLibraryDirecory]URLByAppendingPathComponent:@"MyApplicationName"]; 
    return pathURL; 

}

- (NSURL *) applicationLibraryDirecory{ 

    return [[[NSFileManager defaultManager] URLsForDirectory:NSLibraryDirectory inDomains:NSUserDomainMask] lastObject]; 

}

Sie können testen, wenn es vorhanden ist, wenn nicht, es schaffen ... dann speichern Sie Ihre Video-Dateien in diesem Pfad, und übergeben diese an Ihre AVCapture als Speicherort für die Datei.

+0

Offensichtlich ist dies Objective-c ... aber ich bin sicher, dass Sie das Swift-Äquivalent herausfinden können – MDB983

1

Hier ist der Code, der folgende Funktionalität in swift tun kann.

1: Überprüfen Sie, ob das Wetterverzeichnis existiert oder nicht. Wenn nicht, dann erstellen Sie das Verzeichnis (Verzeichnis hat den Namen der Anwendung angegeben) im Ordner des Dokumentenverzeichnisses.

2: Jetzt haben wir Anwendungsverzeichnis. Also alle Dateien, die von der Anwendung in dieses Verzeichnis geschrieben/gelesen werden.

let file = "file.txt" 
    let directoryName = “XYZ” // Here “XYZ” is project name. 
    var error : NSError? 
    let filemgr = NSFileManager.defaultManager() 

    let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, 
       .UserDomainMask, true) 

    let documentsDirectory = dirPaths[0] as! String 

    var dataPath = documentsDirectory.stringByAppendingPathComponent(directoryName) 

    if !NSFileManager.defaultManager().fileExistsAtPath(dataPath) { 
     NSFileManager.defaultManager().createDirectoryAtPath(dataPath, withIntermediateDirectories: false, attributes: nil, error: &error) 
    } else { 
     println("not creted or exist") 
    } 

Jetzt haben wir Verzeichnis, also nur zum Schreiben/Lesen von Daten aus dem Verzeichnis.

wie Datei in Dokumentenverzeichnis in schnellen

let filePath = dataPath.stringByAppendingPathComponent(file); 
    let text = "some text" 

//writing 
text.writeToFile(filePath, atomically: false, encoding: NSUTF8StringEncoding, error: nil); 

schreiben Wie Datei aus Dokumentenverzeichnis zu lesen.

let filePath = dataPath.stringByAppendingPathComponent(file); 
// Read file 
let text2 = String(contentsOfFile: filePath, encoding: NSUTF8StringEncoding, error: nil) 

Ausgang: enter image description here

Hope this Ihnen helfen.