ios - Swift 图片上传保存为 mime_type "data"

标签 ios node.js swift upload

我正在尝试上传(ios swift 应用程序)一堆 URL 参数和图像以在服务器(node express)上创建一个帐户。一切似乎都运行良好,除了图像,一旦保存在服务器上,就会显示为文件类型“数据”,因此不会在浏览器中显示。值得注意的是,我正在尝试的图像是使用 iphone 相机拍摄的,作为注册表单的一部分。数据正确发布,文件正确保存(好吧,名称保存在正确的位置)并且响应被正确接收。

关于 httpbody 有什么我遗漏的吗?这在浏览器和我的 android 应用程序中按预期工作,所以我怀疑它是 swift httpbody 或 node multer 和 bodyparser 中的东西。 任何帮助或朝着正确方向插入都会有所帮助,谢谢! ios方法

    var request = NSMutableURLRequest(URL: NSURL(string: (self.url + path) as String)!)
    request.HTTPMethod = "POST"

    var boundary = generateBoundaryString()
    request.setValue(NSString(format: "multipart/form-data; boundary=%@", boundary) as String, forHTTPHeaderField: "Content-Type")

    var body = NSMutableData()
    if data.count > 0  {
        for( key, value ) in data {

            body.appendData(NSString(format: "\r\n--%@\r\n", boundary).dataUsingEncoding(NSUTF8StringEncoding)!)
            body.appendData(NSString(format: "Content-Disposition: form-data; name=\"%@\"\r\n\r\n", (key as? String)!).dataUsingEncoding(NSUTF8StringEncoding)!)
            if let string = value as? String {
                body.appendData(NSString(format: "%@\r\n", string).dataUsingEncoding(NSUTF8StringEncoding)!)
            } else if let num = value as? Int {
                body.appendData(NSString(format: "%u\r\n", num).dataUsingEncoding(NSUTF8StringEncoding)!)
            }
        }
    }
    if image != nil {
        var imageData:NSData = NSData(data: UIImageJPEGRepresentation(image!, 1))
        var filename = "profile_\(Int64(NSDate().timeIntervalSince1970*1000)).jpg"
        var mime_type = "image/jpeg"

        body.appendData(NSString(format: "\r\n--%@\r\n", boundary).dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData(NSString(format: "Content-Disposition: form-data; name=\"profile_image\"; filename=\"%@\"\r\n\r\n", filename).dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData(NSString(format: "Content-Type: %@\r\n\r\n", mime_type).dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData(imageData)
        body.appendData(NSString(format: "\r\n").dataUsingEncoding(NSUTF8StringEncoding)!)
    }
    body.appendData(NSString(format: "--%@--\r\n", boundary).dataUsingEncoding(NSUTF8StringEncoding)!)
    request.HTTPBody = body

    request.setValue(NSString(format: "%d", body.length) as String, forHTTPHeaderField: "Content-Length")
    return request

接受请求的 Node (使用multer和express)

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(multer({
    dest: './uploads',
    rename: function (fieldname, filename) {
        return filename.replace(/\W+/g, '-').toLowerCase() + Date.now()
    }
}));

最佳答案

解决方案:

更改了这一行:

body.appendData(NSString(format: "Content-Disposition: form-data; name=\"profile_image\"; filename=\"%@\"\r\n\r\n", filename).dataUsingEncoding(NSUTF8StringEncoding)!)

为此:

body.appendData(NSString(format: "Content-Disposition: form-data; name=\"profile_image\"; filename=\"%@\"\r\n", filename).dataUsingEncoding(NSUTF8StringEncoding)!)

文件名后的额外“\r\n”对文件有些困惑,即使内容类型跟在名称后面,而不是图像数据本身。

去图吧。实际上是 4 个小时的反复试验,我在发布到 SO 后 10 分钟就解决了。

关于ios - Swift 图片上传保存为 mime_type "data",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29707513/

相关文章:

iOS Touch ID 和单点登录

node.js - 为什么来自 Node/Express 的 POST 和 PUT 请求在 React/Redux 中不起作用?我的 GET 和 DELETE 请求一切正常。所有请求都可以在 Postman 中处理

javascript - 在javascript中迭代对象,保留 parent

ios - Swift:在带有完成按钮的文本框上弹出 DatePicker

ios - Swift 自动运行 NSTimer

ios - 我可以从解析中检索信息,也可以打印该数组,但是当我尝试将这些数组元素放入 tableviewcell 时,什么也没有显示

ios - 无法在 ViewController 之间移动

node.js - 如何从 Node.js 缓冲区上的 UInt64 读取 Double?

ios - 没有收到推送通知(并且没有故障排除想法)

ios - 如何从子应用程序检查并打开设备中已安装的父应用程序?