Проблемы с обработкой UIImageJPEGRepresentation или UIImagePNGRepresentation в Node.js

TL;DR: Как вы записываете UIImageRepresentation данные в фактический формат файла на сервере Node.js? (или в любом другом месте за пределами Swift)

.

.

Так что тут я в некотором затруднительном положении...

Я хотел отправить UIImageJPEGRepresentation (или любую форму изображений, закодированных данными) через Alamofire на сервер узла для сохранения там. Я использовал 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);
});

и сохраните его через поток записи. Первоначально я хотел прочитать 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^�>~��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...

SO не позволит мне добавить изображение, потому что моя репутация недостаточно высока... нажмите вместо этого

чтобы обнаружить, что вместо этого это был поврежденный образ, который я не мог использовать. Мое приложение извлекает кадры из камеры на лету и преобразует их в представление UIImage (JPEG/PNG) (см. суть). Следующим лучшим вариантом, похоже, была прямая загрузка (поскольку она работала в Postman), но Alamofire поддерживает только прямые объекты Data или закодированные URL-адреса, и я не думаю, что UIImageJPEGRepresentations можно отправить напрямую. Я действительно просто хочу знать, как обращаться с этими объектами.

Заранее спасибо.


person jasonidris    schedule 22.11.2017    source источник


Ответы (1)


Исправил это быстрее, чем я думал. Я поместил регистратор в код своего сервера для проверки типа 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 и отправляют его без дополнительных параметры (см. Загрузка данных на сервер.) Подобные вещи потенциально могут не давать разработчику спать по ночам...

person jasonidris    schedule 22.11.2017