Swift iOS 讀取和上傳本地文件

在 Swift 中找前,文件模型主要圍繞類以及處理文件和目錄的類型使用糟袁。以下是關(guān)鍵組件:FileManagerURLData

1.文件管理器

充當(dāng)文件系統(tǒng)的接口,允許您創(chuàng)建躺盛、讀取项戴、寫入和刪除文件。

使用 訪問共享實例槽惫。FileManager.default

2.使用 URL

用于指定文件位置周叮。例如辩撑,要訪問 Documents 目錄:URL

迅速

let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!

3.讀取和寫入數(shù)據(jù)

要將數(shù)據(jù)寫入文件:

迅速

let fileURL = documentsDirectory.appendingPathComponent("example.txt")

let data = "Hello, World!".data(using: .utf8)!

try? data.write(to: fileURL)

要從文件讀取數(shù)據(jù):

迅速

let retrievedData = try? Data(contentsOf: fileURL)

4.錯誤處理

使用塊讀取或?qū)懭胛募r始終處理潛在錯誤。do-catch

5.編碼和解碼

利用復(fù)雜的數(shù)據(jù)結(jié)構(gòu)仿耽,可以輕松序列化為 JSON 等格式合冀。Codable

該模型提供了一種有效的管理 iOS 應(yīng)用程序內(nèi)文件的全面方法。


在iOS應(yīng)用中使用Swift語言實現(xiàn)從用戶設(shè)備讀取文件并上傳的功能涉及到多個方面项贺,包括但不限于權(quán)限管理君躺、文件選擇、網(wǎng)絡(luò)請求等开缎。以下是一些關(guān)鍵細節(jié)和可能遇到的難點:

關(guān)鍵細節(jié)

權(quán)限管理:

在訪問用戶的圖片庫棕叫、文檔或其他資源之前,必須先請求相應(yīng)的權(quán)限奕删。

使用UIImagePickerController來允許用戶選擇照片或視頻時俺泣,需要檢查并請求UIImagePickerController所需的權(quán)限(如PHPhotoLibrary權(quán)限)。

對于文檔和其他類型的文件急侥,可以使用UIDocumentPickerViewController來讓用戶選擇文件砌滞,并確保應(yīng)用程序已經(jīng)獲取了正確的權(quán)限(如NSDocumentReadAccess)。

文件選擇:

使用UIImagePickerController或UIDocumentPickerViewController來允許用戶從設(shè)備上選擇文件坏怪。

需要根據(jù)所選文件的類型(如圖片贝润、視頻、文檔等)處理不同的邏輯铝宵。

文件上傳:

文件上傳通常通過HTTP或HTTPS協(xié)議發(fā)送到服務(wù)器打掘。

可以使用URLSession或者第三方庫如Alamofire來發(fā)起網(wǎng)絡(luò)請求。

文件通常作為multipart/form-data類型的數(shù)據(jù)進行上傳鹏秋。

錯誤處理:

處理可能出現(xiàn)的各種錯誤尊蚁,比如網(wǎng)絡(luò)不可用、文件過大侣夷、服務(wù)器響應(yīng)錯誤等横朋。

進度顯示:

實現(xiàn)上傳進度的顯示可以提高用戶體驗,尤其是在上傳大文件時百拓。

安全性和隱私:

確保數(shù)據(jù)在傳輸過程中是加密的琴锭,例如使用HTTPS。

尊重用戶的隱私設(shè)置衙传,明確告知用戶哪些數(shù)據(jù)會被上傳以及如何使用這些數(shù)據(jù)决帖。

難點

權(quán)限請求與拒絕:

用戶可能拒絕應(yīng)用程序訪問他們的文件系統(tǒng),這需要開發(fā)者設(shè)計友好的提示信息以解釋為何需要這些權(quán)限蓖捶。

如果用戶拒絕了權(quán)限請求地回,還需要提供一種方式讓用戶可以在設(shè)置中重新開啟權(quán)限。

兼容性問題:

不同版本的iOS可能會有不同的API和行為,確保應(yīng)用能夠在不同版本的iOS上正常工作是一個挑戰(zhàn)刻像。

網(wǎng)絡(luò)條件不穩(wěn)定:

當(dāng)網(wǎng)絡(luò)條件較差時畅买,上傳可能會失敗或中斷,需要有適當(dāng)?shù)闹卦嚈C制绎速。

文件大小限制:

服務(wù)器可能會對上傳文件的大小有限制皮获,因此需要在客戶端檢查文件大小并在必要時提示用戶焙蚓。

了解并妥善處理上述細節(jié)和難點將有助于開發(fā)出一個健壯且用戶體驗良好的文件上傳功能纹冤。


在iOS中讀取并處理EPUB文件需要幾個步驟。首先购公,你需要從用戶那里獲取EPUB文件萌京,然后解析這個文件,并展示其內(nèi)容宏浩。以下是一個基本的流程來實現(xiàn)這一點:

1. 獲取EPUB文件

你可以通過多種方式讓用戶選擇一個EPUB文件知残,例如使用UIDocumentPickerViewController或者通過應(yīng)用之間的交互(如從“文件”應(yīng)用拖拽文件)等方式讓用戶選取EPUB文件。

2. 解析EPUB文件

EPUB文件實際上是一個ZIP壓縮包比庄,里面包含了HTML文件和其他資源(如CSS樣式表求妹、圖片等)。為了讀取這些內(nèi)容佳窑,你需要解壓這個ZIP文件制恍,并處理里面的HTML文件。

3. 展示內(nèi)容

一旦你有了EPUB中的HTML文件神凑,你可以使用WKWebView或UIWebView(如果支持的話)來渲染這些HTML頁面净神,并展示給用戶。

下面是一個簡單的例子來展示如何實現(xiàn)上述功能的一部分:

獲取EPUB文件

Swift

1func openDocumentPicker() {

2? ? let documentPicker = UIDocumentPickerViewController(documentTypes: ["public.epub"], in: .import)

3? ? documentPicker.delegate = self

4? ? present(documentPicker, animated: true, completion: nil)

5}

這里需要確保你的類遵循UIDocumentPickerDelegate協(xié)議溉委,并實現(xiàn)相應(yīng)的代理方法來處理用戶的選擇鹃唯。

解析EPUB文件

對于解壓和解析EPUB文件,你可能需要依賴于第三方庫瓣喊,例如Zip或者ZipArchive來幫助處理ZIP文件格式坡慌。一旦解壓完成,你需要解析出實際的EPUB元數(shù)據(jù)以及內(nèi)容文件路徑藻三。

使用WKWebView展示內(nèi)容

Swift

1let filePath = "path/to/unzipped/epub/content.html"

2if let url = URL(string: filePath) {

3? ? let request = URLRequest(url: url)

4? ? webView.load(request)

5}

請注意洪橘,以上代碼是簡化的示例,實際應(yīng)用中你可能需要處理更多的情況趴酣,比如錯誤處理梨树、資源管理以及性能優(yōu)化等問題。

如果你不想自己編寫解析EPUB的邏輯岖寞,可以考慮使用現(xiàn)成的庫抡四,比如EbookReader或Aepryus Reader等開源項目,它們已經(jīng)封裝好了處理EPUB文件的功能。

在開發(fā)過程中指巡,請確保遵循Apple的指南和規(guī)范淑履,特別是在處理文件權(quán)限和用戶隱私方面。


在Swift中讀取和上傳本地文件可以通過多種方式實現(xiàn)藻雪。以下是一個詳細的步驟指南秘噪,結(jié)合了我搜索到的資料來說明如何在iOS應(yīng)用中讀取本地文件并上傳到服務(wù)器。

### 1. 讀取本地文件

#### 1.1 獲取本地文件路徑

需要獲取本地文件的路徑勉耀≈讣澹可以使用`Bundle`類的`path(forResource:ofType:)`方法來獲取文件路徑。

```swift

if let filePath = Bundle.main.path(forResource: "example", ofType: "txt") {

? ? print("文件路徑: \(filePath)")

} else {

? ? print("文件不存在")

}

```

#### 1.2 檢查文件是否存在

在讀取文件之前便斥,最好檢查文件是否存在至壤,以避免錯誤。

```swift

if FileManager.default.fileExists(atPath: filePath) {

? ? print("文件存在")

} else {

? ? print("文件不存在")

}

```

#### 1.3 讀取文件內(nèi)容

可以使用`String`或`Data`來讀取文件內(nèi)容枢纠。

```swift

if let fileContent = try? String(contentsOfFile: filePath, encoding: .utf8) {

? ? print("文件內(nèi)容: \(fileContent)")

} else {

? ? print("讀取文件失敗")

}

```

### 2. 上傳本地文件

#### 2.1 使用NSURLSession上傳文件

可以使用`NSURLSession`和`NSURLSessionUploadTask`來上傳文件像街。

```swift

let url = URL(string: "https://example.com/upload ")!

let filePath = Bundle.main.path(forResource: "example", ofType: "txt")!

let fileURL = URL(fileURLWithPath: filePath)

var request = URLRequest(url: url)

request.httpMethod = "PUT"

request.addValue("Bearer your_token_here", forHTTPHeaderField: "Authorization")

let uploadTask = URLSession.shared.uploadTask(with: request, fromFile: fileURL) { data, response, error in

? ? if let error = error {

? ? ? ? print("上傳失敗: \(error)")

? ? } else if let response = response as? HTTPURLResponse, response.statusCode == 200 {

? ? ? ? print("上傳成功")

? ? }

}

uploadTask.resume()

```

#### 2.2 使用AFNetworking上傳文件

如果項目中已經(jīng)使用了AFNetworking,可以利用其提供的API來上傳文件晋渺。

```swift

let manager = AFHTTPSessionManager()

let filePath = Bundle.main.path(forResource: "example", ofType: "txt")!

let fileURL = URL(fileURLWithPath: filePath)

manager.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}


大文件處理

當(dāng)處理較大的文件時镰绎,直接加載整個文件到內(nèi)存中可能會導(dǎo)致應(yīng)用崩潰或性能下降。為了有效地處理這種情況木西,你可以采用分塊上傳(chunked upload)的方式畴栖。這種方式可以將大文件分成較小的部分,每次只上傳一部分户魏,這樣可以減少內(nèi)存使用驶臊,并且在網(wǎng)絡(luò)連接不穩(wěn)定的情況下也更加健壯。

下面是一個示例代碼叼丑,展示了如何使用Swift和URLSession來實現(xiàn)分塊上傳:

Swift

1import Foundation

2

3// 假設(shè)這是你的文件路徑

4let filePath = "/path/to/your/file"

5// 文件名

6let fileName = "yourfile.ext"

7// 服務(wù)器上傳端點

8let serverEndpoint = "https://yourserver.com/upload"

9

10// 分塊大小关翎,可以根據(jù)實際情況調(diào)整

11let chunkSize = 1024 * 1024 // 1MB

12

13func uploadLargeFile(filePath: String, serverEndpoint: String, fileName: String, chunkSize: Int) {

14? ? guard let fileURL = URL(string: filePath),

15? ? ? ? ? let fileData = try? Data(contentsOf: fileURL),

16? ? ? ? ? let fileLength = fileData.count else {

17? ? ? ? print("Error loading file data.")

18? ? ? ? return

19? ? }

20

21? ? let fileLengthInt = Int64(fileLength)

22? ? let request = NSMutableURLRequest(url: URL(string: serverEndpoint)!)

23? ? request.httpMethod = "POST"

24? ?

25? ? // 設(shè)置Content-Type和Content-Length頭

26? ? request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

27? ? request.setValue("\(fileLengthInt)", forHTTPHeaderField: "Content-Length")

28

29? ? // 開始上傳

30? ? let queue = DispatchQueue(label: "com.example.fileupload")

31? ? let semaphore = DispatchSemaphore(value: 0)

32

33? ? // 創(chuàng)建任務(wù)

34? ? let task = URLSession.shared.uploadTask(with: request as URLRequest, fromData: nil) { data, response, error in

35? ? ? ? defer { semaphore.signal() }

36? ? ? ?

37? ? ? ? if let error = error {

38? ? ? ? ? ? print("Upload error: \(error)")

39? ? ? ? ? ? return

40? ? ? ? }

41

42? ? ? ? guard let httpResponse = response as? HTTPURLResponse,

43? ? ? ? ? ? ? (200...299).contains(httpResponse.statusCode) else {

44? ? ? ? ? ? print("Unexpected response: \(response.debugDescription)")

45? ? ? ? ? ? return

46? ? ? ? }

47? ? ? ?

48? ? ? ? print("Upload success!")

49? ? }

50

51? ? // 準(zhǔn)備上傳數(shù)據(jù)

52? ? var offset = 0

53? ? while offset < fileLengthInt {

54? ? ? ? let end = min(offset + chunkSize, Int(fileLength))

55? ? ? ? let subdata = fileData.subdata(in: offset..<end)

56? ? ? ?

57? ? ? ? // 構(gòu)建請求體

58? ? ? ? let body = NSMutableData()

59? ? ? ? body.append("--\(boundary)\r\n".data(using: .utf8)!)

60? ? ? ? body.append("Content-Disposition: form-data; name=\"file\"; filename=\"\(fileName)\"\r\n".data(using: .utf8)!)

61? ? ? ? body.append("Content-Type: application/octet-stream\r\n\r\n".data(using: .utf8)!)

62? ? ? ? body.append(subdata!)

63? ? ? ? body.append("\r\n".data(using: .utf8)!)

64

65? ? ? ? // 更新請求數(shù)據(jù)

66? ? ? ? task.uploadStream?.write(body as Data, timeout: .distantFuture, tag: 0)

67? ? ? ? offset = end

68? ? }

69

70? ? // 結(jié)束請求

71? ? task.uploadStream?.close()

72

73? ? // 等待上傳完成

74? ? semaphore.wait()

75}

76

77// 邊界字符串,用于分隔不同的字段

78let boundary = UUID().uuidString

79

80// 調(diào)用函數(shù)開始上傳

81uploadLargeFile(filePath: filePath, serverEndpoint: serverEndpoint, fileName: fileName, chunkSize: chunkSize)

請注意鸠信,上述代碼中的邊界字符串(boundary)應(yīng)該是一個唯一的字符串纵寝,用于分隔不同的字段。此外星立,你需要確保服務(wù)器支持分塊上傳爽茴,并且能夠正確地解析接收到的數(shù)據(jù)。

這段代碼只是一個基本的示例绰垂,實際應(yīng)用中可能還需要處理更多的異常情況和優(yōu)化上傳邏輯室奏。例如,你可以增加一個回調(diào)來顯示上傳進度劲装,或者在上傳失敗時重試上傳等胧沫。

使用?流讀取數(shù)據(jù)到程序內(nèi)

如果你只是想在iOS應(yīng)用程序內(nèi)部讀取一個較大的文件內(nèi)容而不將其上傳到服務(wù)器昌简,那么可以考慮使用流式讀取的方式來逐步處理文件內(nèi)容。這樣可以避免一次性加載整個文件進入內(nèi)存绒怨,從而降低內(nèi)存占用和提高性能纯赎。

下面是一個使用Swift逐步讀取文件內(nèi)容的例子:

Swift

1import Foundation

2

3// 文件路徑

4let filePath = "/path/to/your/largefile.txt"

5

6func readLargeFile(filePath: String, chunkSize: Int = 1024 * 1024) {

7? ? guard let fileURL = URL(string: filePath) else {

8? ? ? ? print("Invalid file path.")

9? ? ? ? return

10? ? }

11? ?

12? ? do {

13? ? ? ? // 創(chuàng)建一個文件句柄

14? ? ? ? let fileHandle = try FileHandle(forReadingFrom: fileURL)

15? ? ? ?

16? ? ? ? // 獲取文件長度

17? ? ? ? let fileSize = fileHandle.seekToEndOfFile()

18? ? ? ? fileHandle.seek(toFilePosition: 0) // 重置位置

19? ? ? ?

20? ? ? ? // 初始化偏移量

21? ? ? ? var offset = 0

22? ? ? ? while offset < fileSize {

23? ? ? ? ? ? let end = min(offset + chunkSize, fileSize)

24? ? ? ? ? ?

25? ? ? ? ? ? // 讀取指定大小的數(shù)據(jù)

26? ? ? ? ? ? let data = fileHandle.readData(ofLength: end - offset)

27? ? ? ? ? ? let content = String(data: data, encoding: .utf8)

28? ? ? ? ? ?

29? ? ? ? ? ? // 打印或處理讀取的內(nèi)容

30? ? ? ? ? ? print(content ?? "")

31? ? ? ? ? ?

32? ? ? ? ? ? // 更新偏移量

33? ? ? ? ? ? offset = end

34? ? ? ? }

35? ? ? ?

36? ? ? ? // 關(guān)閉文件句柄

37? ? ? ? fileHandle.closeFile()

38? ? } catch {

39? ? ? ? print("Error reading file: \(error)")

40? ? }

41}

42

43// 調(diào)用函數(shù)開始讀取文件

44readLargeFile(filePath: filePath)

在這個例子中,我們創(chuàng)建了一個FileHandle對象來讀取文件南蹂,并且每次只讀取一定大小的數(shù)據(jù)(這里設(shè)置為1MB)犬金。這樣可以確保不會因為文件太大而一次性占用過多內(nèi)存。

注意事項:

文件編碼:上面的例子假設(shè)文件是UTF-8編碼的六剥。如果文件使用其他編碼晚顷,你需要相應(yīng)地更改String初始化的編碼參數(shù)。

內(nèi)存管理:雖然這種方法可以有效減少內(nèi)存使用仗考,但在極端情況下音同,如果文件非常大词爬,還是有可能消耗大量內(nèi)存秃嗜。因此,合理設(shè)置chunkSize是非常重要的顿膨。

性能考慮:頻繁的I/O操作可能會導(dǎo)致性能瓶頸锅锨,特別是在移動設(shè)備上。如果文件特別大恋沃,可能需要進一步優(yōu)化讀取邏輯必搞,比如使用多線程或異步讀取等方式。

這個方法適用于只需要逐步讀取文件內(nèi)容的場景囊咏,例如逐行處理文本文件恕洲、分析日志文件等。如果需要對文件進行更復(fù)雜的處理梅割,可能需要結(jié)合其他技術(shù)如數(shù)據(jù)庫存儲霜第、索引建立等。


.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("上傳進度: \(progress.fractionCompleted)")

}.uploadProgress { progress in

? ? print("

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末户辞,一起剝皮案震驚了整個濱河市伞矩,隨后出現(xiàn)的幾起案子硝桩,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仿畸,死亡現(xiàn)場離奇詭異,居然都是意外死亡刹孔,警方通過查閱死者的電腦和手機泳秀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朱沃,“玉大人苞轿,你說我怎么就攤上這事。” “怎么了呕屎?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵让簿,是天一觀的道長。 經(jīng)常有香客問我秀睛,道長尔当,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任蹂安,我火速辦了婚禮椭迎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘田盈。我一直安慰自己畜号,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布允瞧。 她就那樣靜靜地躺著简软,像睡著了一般。 火紅的嫁衣襯著肌膚如雪述暂。 梳的紋絲不亂的頭發(fā)上痹升,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機與錄音畦韭,去河邊找鬼疼蛾。 笑死,一個胖子當(dāng)著我的面吹牛艺配,可吹牛的內(nèi)容都是我干的察郁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼转唉,長吁一口氣:“原來是場噩夢啊……” “哼皮钠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起酝掩,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤鳞芙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后期虾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體原朝,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年镶苞,在試婚紗的時候發(fā)現(xiàn)自己被綠了喳坠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡茂蚓,死狀恐怖壕鹉,靈堂內(nèi)的尸體忽然破棺而出剃幌,到底是詐尸還是另有隱情,我是刑警寧澤晾浴,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布负乡,位于F島的核電站,受9級特大地震影響脊凰,放射性物質(zhì)發(fā)生泄漏抖棘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一狸涌、第九天 我趴在偏房一處隱蔽的房頂上張望切省。 院中可真熱鬧,春花似錦帕胆、人聲如沸朝捆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芙盘。三九已至,卻和暖如春歼捐,著一層夾襖步出監(jiān)牢的瞬間何陆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工豹储, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人淘这。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓剥扣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親铝穷。 傳聞我的和親對象是個殘疾皇子钠怯,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容