當(dāng)項目中需要上傳大量數(shù)據(jù)至服務(wù)器的時候(例如拿到的藍(lán)牙數(shù)據(jù)包實時上傳)峦失,使用JSON上傳會對服務(wù)器造成較大的壓力沪悲,這時就可以考慮使用上傳流文件的方式蹲姐,首先定義一個寫入流文件的方法
//寫入流文件
func saveOutputStream() {
//判斷如果文件大于指定的size
if fileSizeAtPath() > fileSize {
//保存已寫好的數(shù)據(jù)的下標(biāo)
saveDoneAry.append("\(fileCount)")
//文件標(biāo)記+1
fileCount = fileCount + 1
//判斷網(wǎng)絡(luò)是否可用
if Reachability().connectedToNetwork() {
DispatchQueue.global().async {
//---------------------------------------
tipsLabel.text = "正在上傳第\(fileCount)個文件"
//---------------------------------------
//使用文件流上傳方式
Post().upload()
}
} else {
tipsLabel.text = "網(wǎng)絡(luò)異常昔善,暫停上傳"
}
}
//HealthData為文件名元潘,fileCount為文件的序號
let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("DataFile"+"\(fileCount)")
if let outputStream = OutputStream(url: fileURL, append: true) {
//打開文件
outputStream.open()
//寫入文件 *這里的data是要寫入的數(shù)據(jù),寫入后會返回一個寫入的字節(jié)數(shù)
let bytesWritten = outputStream.write(data!.bytes.assumingMemoryBound(to: UInt8.self), maxLength: (data?.length)!)
//判斷返回的字節(jié)數(shù)大小
if bytesWritten < 0 { print("write failure") }
//關(guān)閉文件
outputStream.close()
} else {
print("Unable to open file")
}
}
通過檢查文件大小的方式可以控制每一個上傳文件的大小君仆,下面是檢查文件大小的方法
//檢查文件大小
func fileSizeAtPath() -> Float {
let home = NSHomeDirectory() as NSString
let docPath = home.appendingPathComponent("Documents") as NSString
let filePath = docPath.appendingPathComponent("DataFile"+"\(fileCount)")
let manager = FileManager.default
var fileSize:Float = 0.0
if manager.fileExists(atPath: filePath) {
do {
if let attr: NSDictionary = try manager.attributesOfItem(atPath: filePath) as NSDictionary? {
fileSize = Float(attr.fileSize())
}
} catch {
}
}
return fileSize;
}
最后翩概,上傳的時候使用文件名"DataFile"拼接上saveDoneAry.first,當(dāng)上傳成功后返咱,需要saveDoneAry.removeFirst()钥庇,以保證能依次上傳文件