You are not logged in.
Pages: 1
Very difficult trying to figure out exactly what to post. Trying to separate a POST from the syntax for php when I have never looked at PHP before is not working. The example in C# is easier to understand but still not getting anywhere.
The form data consists of a number of key value pairs - what are all the options that can be used there?
This is what I have so far.
login using Core.LoginWithKey - and record the sessionID it gives me
we have a user called imsadmin set up as an administrator.
do a http post using core.ImpersonateUser and passing in imsadmin and record the sessionID from that.
do a http post using folders.CreateFolder
Above post uses sessionID returned by ImpersonateUser and it returns a posturl "https://ims.mydomain.com/dofileupload.t … tViLtY4Abf"
I added &t=ajax to the end of the URL so that it does not return a html page
I created a post as follows:
URL is "https://ims.mydomain.com/dofileupload.t … Abf&t=ajax"
Added a header "IMSSESSID" with value the sessionID returned from ImpersonateUser
key: "file1" value: "c:\x\y\z.jpg" (where x and y are folder and subfolder on my c drive and z is a filename)
key: "file1_caption" value: "Nice Sunset"
the message returned from this post was "Sorry, but you do not have access to this page."
What am I doing wrong?
Last edited by mdyason (2015-02-27 00:53:39)
Offline
I tried logging in with core.login with my own username and password. I definitely have access to the folder. I get the same result. I assume I have a syntax issue with the post itself
Offline
Hi,
The immediate problem is that IMSSESSID should be provided as an HTTP cookie - it is not accepted as a header in its own right. You could also avoid this entirely by using the 'allowotheruserupload' option in the call to Uploads.CreateUpload.
The secondary issue that I can see is that you need to send file data in the HTTP post (in multipart/form-data format) - a local path on your machine cannot be opened from IMS.
Kind regards,
Dominic
Offline
Thanks for looking at this dominic. I was sending the HTTPrequest in multipart/form-data format.
So leaving out the sessionID my HTTP request looks like this:
POST /dofileupload.tlxr?task=tptU5ePPEtViLtY4Abf&t=ajax HTTP/1.1
Host: imstest.matrix-solutions.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file1"
MySunset.jpg
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file1_caption"
Sunset over bay
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="whatGoesHere"; filename="MySunset.jpg"
Content-Type: image/jpeg
-xxxxxxxxxxxx-
----WebKitFormBoundary7MA4YWxkTrZu0gW
The data for the jpeg is just shown as "-xxxxxxxxxxxx-". I assume this should be pure binary stream? (I am using postman to generate this and the text it sends here is the same as you would see if you opened the jpeg using notepad). What should I name this last piece of form data? I guess I need to replace the string "whatGoesHere" with something the form handler will understand? Or should the actual data somehow be sent as part of the formfield that takes the filename?
I have tried doing this in a number of ways, putting quotes in, leaving quotes out etc. No matter what I do, i get exactly the same response: {"error":true,"message":"Sorry, but you do not have access to this page."}
I am not sure if this is because the syntax of my request is wrong or if the page just will not have anything to do with me because of an access issue.
Last edited by mdyason (2015-03-02 22:46:50)
Offline
The client reference (implicitly file1 in your example) should be used as the name of the part containing the file data - the filename will be parsed out of this content-disposition header. You do not need the file1=MySunset.jpg entry.
As I mentioned previously, to avoid the access denied message you need to either send the session ID as an cookie called IMSSESSID, or specify 'allowotheruserupload' when creating the upload job.
Dominic
Offline
That actually made no difference. I actually tried exactly this yesterday. I did it again just now.
My whole process looks as below: (I ran this through fiddler and made sure that the request going to the server was exactly as intended. Including the data for the jpeg)
Logon:
POST /api.json.tlx HTTP/1.1
Host: imstest.matrix-solutions.com
Content-Type: application/json
{"apiVersion": "1.0.1", "action": "core.login", "inParams": {"username": "m...", "password": "..."}}
The result was:
{"result":{"api":"OK","action":"OK"},"outParams":{"sessionId":"qadblRbPRHnBJPv9D4kKQOiN65WWAYYu","userDetails":{"type":1,"userref":"1-4","username":"m...","description":"Michelle .....","email":"....","canPublish":true}}}
CreateUpload:
POST /api.json.tlx HTTP/1.1
Host: imstest.matrix-solutions.com
Content-Type: application/json
{"apiVersion": "1.0.1", "action": "Upload.CreateUpload",
"inParams": { "params": {"destination": "28168108553",
"synchronous": "true",
"lifetime": "60",
"editablemetadata": { "caption": "OPTIONAL" },
"allowotheruserupload": "true" }},
"sessionId": "qadblRbPRHnBJPv9D4kKQOiN65WWAYYu" }
The result was:
{"result":{"api":"OK","action":"OK"},"outParams":{"uploadKey":"jgjtzn44ZjASNj-nbaB","postURL":"https:\/\/imstest.matrix-solutions.com\/dofileupload.tlxr?task=jgjtzn44ZjASNj-nbaB"}}
Upload:
POST /dofileupload.tlxr?task=jgjtzn44ZjASNj-nbaB&t=ajax HTTP/1.1
Host: imstest.matrix-solutions.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file1"; filename="MySunset.jpg"
Content-Type: image/jpeg
-xxxxxxxxxxxx-
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file1_caption"
Sunset over bay
----WebKitFormBoundary7MA4YWxkTrZu0gW
result was:
{"error":true,"message":"Sorry, but you do not have access to this page."}
by the way a check using upload.CanUploadToFolder did return true
Last edited by mdyason (2015-03-03 19:30:06)
Offline
Now I'm really confused - after getting the above and posting it here, I looked in the Application and the image is in there, with the caption as shown above. Looking at upload date and time confirms the above code did in fact upload the image. But I received the error????
So I tried it again and everything looked exactly the same - the 2nd image never showed up in the app. ????
Last edited by mdyason (2015-03-03 18:42:34)
Offline
It is hard to say for sure without seeing timings, but I do note that the lifetime on the upload task is 60 seconds - so if you attempt to send files after this elapses then you would get the same error. At a guess, the post was sent twice, the first was successful but the second was after the time limit, and it was this second response that you saw.
Offline
Wonderful. You are exactly correct. Thank you. This is now working properly. That was a pretty stupid mistake on my part.
Offline
I spoke too soon. The above is working perfectly if I just want to upload a single image, however if I then try and upload a second image using exactly the same code it fails with {"error":true,"message":"Sorry, but you do not have access to this page."}. Each try I just changed name="file1" to name="file2" and name="file1_caption" to name="file2_caption" and of course choose a new image with a different name.
Is this expected or not? How would you go about posting many images (one after the other)? Surely I can do many posts to the same URL? Is there something I have to do between uploads? Surely I do not have to create a new upload ID for each image? (Which does actually work!)
Last edited by mdyason (2015-03-05 23:25:23)
Offline
I suspect that this is an extension of the issue you were having with the 'lifetime' limit - try setting it to an hour (i.e. 3600), and upload a series of files. That should continue to work until the lifetime expires, or you make an API request to complete/abort the task.
Offline
This was using a lifetime of 3600. (After realizing my mistake the other day I changed all stored tests to 3600).
Tried it again this morning - does not work. Have been doing load testing by creating an upload then uploading one image then creating another upload etc.
The second post looks like this:
POST /dofileupload.tlxr?t=ajax&task=2yB_2yFkxxe2EQm2GOFjf HTTP/1.1
Host: imstest.matrix-solutions.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file2"; filename="1.jpg"
Content-Type: image/jpeg
{photo data here}
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file2_caption"
upload test2
----WebKitFormBoundary7MA4YWxkTrZu0gW
{"error":true,"message":"Sorry, but you do not have access to this page."}
Last edited by mdyason (2015-03-10 18:22:40)
Offline
Is this expected or not? How would you go about posting many images (one after the other)? Surely I can do many posts to the same URL? Is there something I have to do between uploads? Surely I do not have to create a new upload ID for each image? (Which does actually work!)
Offline
Pages: 1