2015-04-17 2 views
1

Я пытаюсь загрузить (приложение ios swift) кучу параметров URL и изображение для создания учетной записи на сервере (узел экспресс). Кажется, что все работает хорошо, за исключением того, что изображение, сохраненное на сервере, отображается как «тип данных» типа файла и поэтому не будет отображаться в браузере. Стоит отметить, что изображения, которые я пытаюсь сделать, принимаются с помощью камеры iphone как часть формы регистрации. Данные правильно помещаются, файл сохраняется корректно (ну, это имя делает и в нужном месте), и ответ получен правильно.Быстрая загрузка изображения сохранена как mime_type «data»

Есть ли что-то, что мне не хватает в httpbody? Это работает как в браузере, так и в моем приложении для Android, поэтому я подозреваю, что это что-то вроде либо быстрого httpbody, либо узла multer и bodyparser. Любая помощь или толчок в правильном направлении были бы полезны, спасибо! Метод ИОС

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 

Узел, который принимает запрос (с использованием multer и экспресс)

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() 
    } 
})); 

ответ

0

Решение:

изменил эту строку:

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 часа проб и ошибок, и я решил это через 10 минут после публикации в SO.

Смежные вопросы