0

TL;DR:如何将UIImageRepresentation数据写入 Node.js 服务器中的实际文件格式?(或 Swift 之外的任何地方)

.

.

所以我在这里有点困境......

我想通过 Alamofire 将 UIImageJPEGRepresentation(或任何形式的数据编码图像)发送到节点服务器,然后保存在那里。我用 Busboy 来处理MultipartFormData...

  busboy.on('field', function(fieldname, val, fieldnameTruncated, valTruncated, encoding, mimetype) {
  var datamail = './storage/' + fieldname;
  var stream = fs.createWriteStream(datamail)
  console.log('Field [' + fieldname + ']: value: ' + util.inspect(val));
  console.log('Storing letter in ' + datamail);
  stream.write(val);
});

并通过写入流保存。我本来想读取我输入的a UIImage,但我不确定服务器会如何响应这样的对象,所以我去使用UIImageJPEGRepresentation.它正确读取UIImageJPEGRepresentation对象......

Field [test.png]: value:
'�PNG\r\n\u001a\n\u0000\u0000\u0000\rIHDR\u0000\u0000\u0000d\u0000\u0000\u0000d\b\u0002\u0000\u0000\u0000��\u0002\u0003\u0000\u0000\u0000\u0001sRGB\u0000��\u001c�\u0000\u0000\u0000\u001ciDOT\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u00002\u0000\u0000\u0000(\u0000\u0000\u00002\u0000\u0000\u00002\u0000\u0000(aj\rp�\u0000\u0000(-IDATx\u0001��\u0007T\u0014��LJ�\u0005X�\u0002�,u�w�+����KԈ-�\u0016[Ԩ�$1&j�I�b�\u0002��*Mz�lﻔ��م\r���s��yΜ��\u0011�����\u000e"���%S��`r�I\u0014j�Ie�OL,W��d�OM��I��%R�H�\u0019_��\u001bl�M�]�U U�\t�d2�T��\u0017H�k|��\u0013㉤�\te`]\u0002)X��O�!�\f�v�XoȿD\nn�a���?�`��\u0013R��\u001f��\u000e �_\u0007`�=:\u0010B�JozRz����\t�\u001f��\u0013X:^�CX\u000f.<9�c�\r§C��¢�$R�W?��:\u001a�L�\u0016K��\u0001\u0013H���\u000f����`�\u0013e���K\'���\u001a,+X�e\u0005�YY\u000f\u0016��A�`=\u0000�\u000f4zF�,t8t��\r�\u0005;�\b�JUz^��^Y�\t�\u001f��;�8��\u0004K\u001f�`�\u0003�wLX`�����2����e:4�|\u0007�5�L���p\u0006��ڸ��*Ē~��\u0015`�b���k\u0010����\u000fK/���t��\u0012�DD�\bbـ�\u0006�v\u0010,�T�5����tZ����\u000e�����wť����^�뿠�D���~08l-SH���$J0��\u0006�a�\u0006\u0014���\u0012��$\u0012H�������\u000e�`Xz}��a}�)=A��O����A\n\u001a�\f��ХNLt\u0018&�\u0015C�\r^:��q�Â�?\u000f�/x��z^�H�\u000b��[X@J�Ԁ\u0001)�@�\u0005^#Wh����a�ݩ-�tp�O��D�\u0001��&��ucWmDצK-5�\u0002c\'�\u0002\u0016�w�X.\u0014�ty\u0000v>A\u0006�\u0017����m��g��\u0012�����\u0002v�N6�˸\u000e��=�\u0016\u0013��Â}x\fL/Z�zX IX�W\u000e�h@J"ш\u0015=\u0000K(�\u0000,���\u0000�\u0000�\u000e\u0013���\u0018��\u0005|\u0017�a_ʱ�CGG��/I���+,�\u0013u6�\u0007a�_P\u0000E�����\u000elbP��c��\u0002T�\u0001�(u=\u0000\\�ˁ�\u0003�k\u0014�n�H)����n�\u0007\n� L>�\u0001�U�P1���^�\u001f�\u0013b7�nô��`��>����t;���V�rF�d���\u001de\r&\u0005O�=�\u0016\u001f�\u0011ɡ\u0010�R>&%�\nj\b��\u0000d�H�ݩ\u0006�\u0012e�H�\'Q�bE\u001f_�˓�t��;E�\u000e��C��!Ay2�K��@\u0006��J\u0014�\u0012�\u0010\u0016�\u00142�\u001f1:�rD�\u0019`>>\u0018\u0016�v@�S�\bK\u0007np����R�\u001b��0\u0018\u0016\u0000�oa�Ru+\u0015�J�F#��H42�L�Ķz$RT$F�¾�vuE-/3�+%��EJS⫦�IM\u000f^�&gt;~��4���K��7�W�o3��y��"EY������\u000b\u0015I��J\u0002?R\u0001rÄ�\r^:q���\u001a�/U�j�\u001dXBI\u0017��g�\u0004\u0016P�w`\r�\u0005�t�ғ¤$U�%�^��O�A�R\u0000��Ҧ(��H�j|��x?��Σ�;\u000fx7�u�r��ʍ΋��~�����\r��_;�]i��b�OW���|�z��[տݩ�������|Iu���\u000b��~�\u0002d...

成功地将其保存为.jpeg ...

所以不会让我添加图片,因为我的代表不够高......请点击

发现它是一个我无法使用的损坏图像。我的应用程序即时从相机中提取帧并将它们转换为 UIImage(JPEG/PNG)Representation (参见要点)。下一个最好的选择似乎是直接上传(因为它在 Postman 中工作)但 Alamofire 只支持直接Data对象或 URL 编码的东西,我认为UIImageJPEGRepresentations不能直接发送。我真的只想知道如何处理这些对象。

提前致谢。

4

1 回答 1

0

比我想象的更快地修复了这个。我在服务器代码中放置了一个记录器来检查 MIME 类型:

busboy.on('field', function(mimetype) {
  // var datamail = /*path.join('.', 'storage', fieldname);*/ './storage/' + fieldname;
  // var stream = fs.createWriteStream(datamail)
  console.log(MIMETYPE: ' + mimetype);
});

...发现text/plain一个。我去了 Alamofire 并改变了参数,

由此:

Alamofire.upload(
multipartFormData: { multipartFormData in
    multipartFormData.append(compresso!, withName: "test.png")
},

对此:

Alamofire.upload(
multipartFormData: { multipartFormData in
// notice the MIME change
    multipartFormData.append(compresso!, withName: "test.png", fileName: "file.jpg", mimeType: "image/png")
},

它奏效了!它能够安全地进行处理并做它的事情。他们应该在 Alamofire 示例中真正改变这一点,因为他们使用 PNG 表示并在没有额外参数的情况下发送它。(请参阅将数据上传到服务器。)类似的东西可能会让开发人员在晚上保持清醒......

于 2017-11-22T21:34:52.647 回答