Skip to content

Commit e5d9051

Browse files
authored
Merge pull request #291 from zapcannon87/developer
feat(storage): keep file name
2 parents 79144d4 + b62cf4c commit e5d9051

File tree

3 files changed

+45
-19
lines changed

3 files changed

+45
-19
lines changed

LeanCloudTests/LCFileTestCase.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,13 @@ class LCFileTestCase: BaseTestCase {
161161
XCTAssertNil(wf)
162162
}
163163

164+
func testSaveOptions() {
165+
let fileURL = bundleResourceURL(name: "test", ext: "png")
166+
let file = LCFile(payload: .fileURL(fileURL: fileURL))
167+
XCTAssertTrue(file.save(options: .keepFileName).isSuccess)
168+
XCTAssertTrue(file.url!.value.hasSuffix("/test.png"))
169+
}
170+
164171
func testFetch() {
165172
let fileURL = bundleResourceURL(name: "test", ext: "png")
166173
let savedFile = LCFile(payload: .fileURL(fileURL: fileURL))

Sources/Foundation/File.swift

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -104,29 +104,49 @@ public class LCFile: LCObject {
104104

105105
// MARK: Save
106106

107+
/// Save Options
108+
public struct Options: OptionSet {
109+
public let rawValue: Int
110+
111+
public init(rawValue: Int) {
112+
self.rawValue = rawValue
113+
}
114+
115+
/// Using "/\(LCFile.name)" as URL suffix when creating file from payload.
116+
public static let keepFileName = Options(rawValue: 1 << 0)
117+
}
118+
107119
/// Save file synchronously.
108-
public func save() -> LCBooleanResult {
120+
/// - Parameter options: @see `LCFile.Options`, default is none.
121+
public func save(options: LCFile.Options = []) -> LCBooleanResult {
109122
return expect { fulfill in
110-
self.save(progressOn: .main, progress: nil) { result in
123+
self.save(
124+
options: options,
125+
progressOn: .main,
126+
progress: nil)
127+
{ result in
111128
fulfill(result)
112129
}
113130
}
114131
}
115132

116133
/// Save file asynchronously.
134+
/// - Parameter options: @see `LCFile.Options`, default is none.
117135
/// - Parameter progressQueue: The queue where the progress be called. default is main.
118136
/// - Parameter progress: The progress of saving.
119137
/// - Parameter completionQueue: The queue where the completion be called. default is main.
120138
/// - Parameter completion: The callback of result.
121139
@discardableResult
122140
public func save(
141+
options: LCFile.Options = [],
123142
progressQueue: DispatchQueue = .main,
124143
progress: ((Double) -> Void)? = nil,
125144
completionQueue: DispatchQueue = .main,
126145
completion: @escaping (LCBooleanResult) -> Void)
127146
-> LCRequest
128147
{
129148
return self.save(
149+
options: options,
130150
progressOn: progressQueue,
131151
progress: progress)
132152
{ result in
@@ -154,6 +174,7 @@ public class LCFile: LCObject {
154174

155175
@discardableResult
156176
private func save(
177+
options: LCFile.Options,
157178
progressOn queue: DispatchQueue,
158179
progress: ((Double) -> Void)?,
159180
completion: @escaping (LCBooleanResult) -> Void)
@@ -168,12 +189,15 @@ public class LCFile: LCObject {
168189
completionHandler: completion)
169190
}
170191
if let payload = self.payload {
171-
return FileUploader(file: self, payload: payload).upload(
172-
progressQueue: queue,
173-
progress: progress)
174-
{ result in
175-
self.handleUploadResult(result, completion: completion)
176-
}
192+
return FileUploader(
193+
file: self,
194+
payload: payload,
195+
options: options).upload(
196+
progressQueue: queue,
197+
progress: progress,
198+
completion: { result in
199+
self.handleUploadResult(result, completion: completion)
200+
})
177201
} else if let remoteURL = self.url {
178202
self.paddingInfo(remoteURL: remoteURL)
179203
var parameters = dictionary.jsonValue as? [String: Any]

Sources/Foundation/FileUploader.swift

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,14 @@ import MobileCoreServices
1717
File uploader.
1818
*/
1919
class FileUploader {
20-
21-
/// The file to be uploaded.
2220
let file: LCFile
23-
24-
/// The file payload to be uploaded.
2521
let payload: LCFile.Payload
22+
let options: LCFile.Options
2623

27-
/**
28-
Create file uploader with file.
29-
30-
- parameter file: The file to be uploaded.
31-
- parameter payload: The file payload to be uploaded.
32-
*/
33-
init(file: LCFile, payload: LCFile.Payload) {
24+
init(file: LCFile, payload: LCFile.Payload, options: LCFile.Options) {
3425
self.file = file
3526
self.payload = payload
27+
self.options = options
3628
let configuration = URLSessionConfiguration.default
3729
configuration.urlCache = nil
3830
self.session = Session(
@@ -260,6 +252,9 @@ class FileUploader {
260252
parameters["key"] = attributes.resourceKey
261253
parameters["name"] = attributes.name
262254
parameters["mime_type"] = attributes.mimeType
255+
if self.options.contains(.keepFileName) {
256+
parameters["keep_file_name"] = true
257+
}
263258

264259
var metaData: [String: Any] = (file.metaData?.jsonValue as? [String: Any]) ?? [:]
265260
metaData.merge(["size": attributes.size]) { (current, _) in current }

0 commit comments

Comments
 (0)