Re: [Pharo-users] Question ZnClient with file
Hi, CC'ing the Pharo Users ML since that gives a permanent record of my answer. File uploads using ZnClient do work in the common case. You can check ZnServerTest>>#testFormTest3 or ZnImageExampleDelegateTest>>#testUpload as well as several other senders of #addPart: First you are mixing 2 types of forms (see https://ci.inria.fr/pharo-contribution/job/EnterprisePharoBook/lastSuccessfu... section 6. Submitting HTML Forms). For a file upload you need a ZnMultiPartFormDataEntity which is configured automatically in ZnClient by #multiPartFormDataEntity when you do #addPart: (no need to set a content type). Next you are mixing the file name and the file contents. It is best to use the class side ZnMimePart instance creation methods, either #fieldName:fileName:entity: or #fieldName:fileNamed: Also, when you create a ZnByteArray entity with the contents of a .jpg or .png you not only have to load the actual bytes (obviously), but you also have to set the mime type correctly. In #fieldName:fileNamed: you can see how this is done by using the file extension, but that is just one way to do it, if you know the type upfront, just set it. There is also ZnClient>>#uploadEntityFrom: (used by #testUploadSmallDocument) but that is not using a form. I am sure you will be able to figure it out, if not just ask. Sven
On 30 Aug 2020, at 09:51, Sabine Manaa <manaa.sabine@gmail.com> wrote:
Hi Sven,
I hope you are well this serious times!
I have a problem with ZnClient. I was asking yesterday in Discord but we did not find a solution.
https://discordapp.com/channels/223421264751099906/223421264751099906/749313...
I write a summary here:
I have this command, which works fine on the command line:
curl -X POST "https://my.sevdesk.de/api/v1/Voucher/Factory/uploadTempFile?token=32695d0762..." -H "accept: application/xml" -H "Content-Type: multipart/form-data" -F "file=@/Users/sabine/Desktop/belege/neue_belege/mcdonalds.jpeg;type=image/jpeg"
Now, I want to "translate" this in a ZnClient command, but I do not get it. my command is:
^ ZnClient new systemPolicy; https; accept: ZnMimeType applicationXml; headerAt: 'Content-Type' add: 'multipart/form-data'; host: 'my.sevdesk.de'; path: '/api/v1/Voucher/Factory/uploadTempFile?token=32695d076245b124b0faaa56afc71b74'; ifFail: [ :exception | exception response entity inspect ]; formAt: 'file' put: '@/Users/sabine/Desktop/belege/neue_belege/mcdonalds.jpeg'; formAt: 'type' put: 'image/jpeg'; post
There must be a difference between the command line and the ZnClient command because with the ZnClient command, I get this error: {"objects":null,"error":{"message":"Uploaded file is not inside the allowed directory","code":null,"data":null}}.
I was also trying to get the command line from the ZnClient instance with the method curl but that gives me this:
echo 66696c653d402f55736572732f736162696e652f4465736b746f702f62656c6567652f6e6575655f62656c6567652f6d63646f6e616c64732e6a70656726747970653d696d6167652f6a706567 | xxd -r -p | curl -X POST https://my.sevdesk.de:443/api/v1/Voucher/Factory/uploadTempFile?token=32695d... -H"User-Agent:Zinc HTTP Components 1.0 (Pharo/7.0)" -H"Accept:application/xml" -H"Content-Type:application/x-www-form-urlencoded" -H"Host:my.sevdesk.de" -H"Content-Length:77" --data-binary @-
Would be very nice if you could help me. All I want ist to "translate" the above curl command in a corresponding ZnClient command....
Regards Sabine
participants (1)
-
Sven Van Caekenberghe