Swift通过WCF上传文件

时间:2018-03-25 03:09:12

标签: swift vb.net rest wcf

我已经打了十多个小时并且在来到这里之前做到了最好。我看过的许多教程最终都被一两个版本过时和/或缺少解释中的一些关键知识。

我正在尝试使用WCF Rest Service将PDF上传到服务器。当我在WCF服务上调试时,名为document的变量是一个空流。我在网上搜了好几个小时尝试了很多不同的东西,我已经筋疲力尽了很多尝试让这么小的东西上班!真正令人讨厌的是,这不是第一次有人需要这样做但我没有在任何地方找到答案。

如果有更好的方式发布PDF而不是我发布的内容,我愿意接受建议,但我不想使用第三方框架。

要求:   - 需要使用WCF服务   - 我没有保存到文件系统或UNC

我需要获得传递给服务的有效内存流,我可以从那里处理功能代码。我之前尝试过使用Base64DataString,我也可以使用它。如果你想提供这个选项,我愿意接受它。

请帮忙!

Swift 4代码:

导入PDFKit

class FileUpload {

    static func generateBoundaryString() -> String {
        return "Boundary-\(UUID().uuidString)"
    }

    static func dataUploadBodyWithParameters(_ parameters: [String: Any]?, filename: String, mimetype: String, dataKey: String, data: Data, boundary: String) -> Data {
        var body = Data()
        // encode parameters first
        if parameters != nil {
            for (key, value) in parameters! {
                body.appendString("--\(boundary)\r\n")
                body.appendString("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
                body.appendString("\(value)\r\n")
            }
        }

        body.appendString("--\(boundary)\r\n")
        body.appendString("Content-Disposition: form-data; name=\"\(dataKey)\"; filename=\"\(filename)\"\r\n")
        body.appendString("Content-Type: \(mimetype)\r\n\r\n")
        body.append(data)
        body.appendString("\r\n")
        body.appendString("--\(boundary)--\r\n")
        print(body)
        return body
    }

    static func uploadData(_ data: Data, toURL urlString: String, withFileKey fileKey: String, completion: ((_ success: Bool, _ result: Any?) -> Void)?) {
        if let url = URL(string: urlString) {
            // build request
            let boundary = generateBoundaryString()
            var request = URLRequest(url: url)

            request.httpMethod = "POST"
            request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
            request.setValue("application/json", forHTTPHeaderField: "Accept")

            // build body
            let body = dataUploadBodyWithParameters(nil, filename: "iOSUpload.pdf", mimetype: "application/pdf", dataKey: fileKey, data: data, boundary: boundary)
            request.httpBody = body

            //UIApplication.shared.isNetworkActivityIndicatorVisible = true
            URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) -> Void in
                if data != nil && error == nil {
                    do {
                        let result = try JSONSerialization.jsonObject(with: data!, options: [])
                        print(result)
                        DispatchQueue.main.async(execute: { completion?(true, result) })
                    } catch {
                        DispatchQueue.main.async(execute: { completion?(false, nil) })
                    }
                } else { DispatchQueue.main.async(execute: { completion?(false, nil) }) }
                //UIApplication.shared.isNetworkActivityIndicatorVisible = false
            }).resume()
        } else { DispatchQueue.main.async(execute: { completion?(false, nil) }) }
    }

}

extension Data {
    mutating func appendString(_ string: String) {
        let data = string.data(using: String.Encoding.utf8, allowLossyConversion: true)
        append(data!)
    }
}

}

WCF相关代码:

<ServiceContract>
Public Interface IWebService

<OperationContract>
    <WebInvoke(Method:="POST", UriTemplate:="UploadFile/{fileName}")>
    Function UploadFile(fileName As String, document As Stream) As String

End Interface

<ServiceBehavior(InstanceContextMode:=InstanceContextMode.Single)>
Public Class MyWebService : Implements IWebService

Public Function UploadFile(fileName As String, document As Stream) As String Implements IWebService.UploadFile
        'document is null
End Function

0 个答案:

没有答案