Based on ocsigen documentation http://ocsigen.org/tuto/6.4/manual/how-to-send-file-upload and http://ocsigen.org/ocsigenserver/2.9/manual/config.html#upload , I tried to upload a document to an ocsigen app (I tested it on my machine, Ubuntu 18). I used code from tutorial that I modified to include path to some directory on my machine, and I added the path to that directory in .conf.in file inside ocsigen and server xml nodes as needed. I could run the server, but when I submit a file on localhost through my browser, I get a “forbidden error 403”. I think I am doing something wrong. Maybe I mess up between absolute path on my machine, virtual absolute path on the app, and relative path… As I found documentation not very helpful on this, I tried several things unsuccessfully.
Here is the code of what I tried :
[%%shared open Eliom_lib open Eliom_content open Html.D ] let upload = Eliom_service.create ~path:(Eliom_service.Path ["upload"]) ~meth:(Eliom_service.Get Eliom_parameter.unit) () let upload2 = Eliom_registration.Html.create (*I corrected here the tutorial: Http <- Html*) ~path:(Eliom_service.Path ["upload"]) ~meth:(Eliom_service.Post (Eliom_parameter.unit, Eliom_parameter.file "file")) (fun () file -> let newname = "/home/milan/prog/ocaml/2019/ocsigen-learn/upload_doc/local/var/www/tmp/thefile" in (try Unix.unlink newname; with _ -> ()); Lwt_unix.link (Eliom_request_info.get_tmp_filename file) newname; Lwt.return (html (head (title (txt "Upload")) ) (body [h1 [txt "ok"]]))) let uploadform = Eliom_registration.Html.register upload (fun () () -> let f = (Form.post_form upload2 (fun file -> [p [Form.file_input ~name:file (); br (); Form.input ~input_type:`Submit ~value:"Send" Form.string ]]) ()) in Lwt.return (html (head (title (txt "form")) ) (body [f])))
and in the upload-doc.conf.in :
<ocsigen> <server> <port>%%PORT%%</port> [...] <host hostfilter="*"> <static dir="%%STATICDIR%%" /> <static dir="%%ELIOMSTATICDIR%%" /> <eliommodule module="%%LIBDIR%%/%%PROJECT_NAME%%.cma" /> <eliom/> </host> <uploaddir>/home/milan/prog/ocaml/2019/ocsigen-learn/upload_doc/local/var/www/tmp</uploaddir> <maxuploadfilesize>2MB</maxuploadfilesize> <maxrequestbodysize>100MB</maxrequestbodysize> </server> </ocsigen>
I tried several things like the /var/www/tmp exemple (creating manually a tmp directory in local/var/www), putting it inside the static directory or setting a UPLOADDIR variable inside Makefile.options.
Could someone give me an insigth on what I have to do very precisely ?