KimHJ 3 Posted November 15 (edited) I'm creating an application for a android device were the user takes a picture and it is store on a local network drive. After taking the picture I tried this , but it keeps saying that the path doesn't exist. I was looking around but I haven't fund any thing similar, the Google AI suggested that I use the Android Api contentResolver, but I'm unable locate that unit. procedure TMainForm.Button2Click(Sender: TObject); var PicPath: String; begin PicPath := '\\SERVER\CSPictures'; try if DirectoryExists(PicPath) then Image1.Bitmap.SaveToFile(PicPath + '\' + Edit1.Text + '.jpg') else ShowMessage('Can not find path ' + PicPath); except on E: Exception do ShowMessage('Unable to save picture to' + PicPath); end; end; Thanks for any help. Edited November 15 by KimHJ Share this post Link to post
Dave Nottage 557 Posted November 15 2 hours ago, KimHJ said: Google AI suggested that I use the Android Api contentResolver Is there some reason why you haven't included here what it suggested? 2 hours ago, KimHJ said: but I'm unable locate that unit. You can access the ContentResolver via: TAndroidHelper.Context.getContentResolver, by including the Androidapi.Helpers unit. Regardless, I expect you'll need to use a library such as smbj to access files via Windows shares, which means either finding a Delphi implementation or creating imports and writing the code yourself that uses smbj (or some other library that does the same thing). Share this post Link to post
KimHJ 3 Posted November 16 If I have an Apache running on the computer could I use TNethttpClient? I have another Delphi/Android app that retrieves bitmaps from a Windows Server in the cloud using TNethttpClient, I know how to do that part. I will have to find out how to create a conf file to go to a specific path. Share this post Link to post
KimHJ 3 Posted November 17 I got it to work with Apache. I had to add android:usesCleartextTraffic="true" in the manifest to be able to save and load with http, since the local machine don't have a SSL. Share this post Link to post
KimHJ 3 Posted November 17 I was to quick in saying that I had it. Loading an image a display it is working. I'm doing something wrong when I save, if I add a name to the URL like url := 'http://192.168.1.150/test1234.png' I get an error that path is not found. If I create a png file in the folder with that name I get no errors, but the image is not updated. I assume I have to name the Image first and the save it, but I don't see any option in TImage to assign a name to the bitmap, the image comes from the camera. Here is my code. procedure TMainForm.SaveImageToURL(const S: String); var ms : TMemoryStream; httpCli : TNetHTTPClient; resp : IHTTPResponse; url : String; Image: TBitmap; begin httpCli := TNetHTTPClient.Create(nil); try httpCli.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0'; ms := TMemoryStream.Create(); try url := 'http://192.168.1.151/Test1234.png'; Image := TBitmap.Create; try ms.Seek(0,0); Image := Image1.Bitmap; Image.SaveToStream(ms); finally Image.Free; end; resp := httpCli.Post(url, ms); if resp.StatusCode <> 200 then Showmessage(Format('HTTP Error=%d %s', [resp.StatusCode, resp.StatusText])) finally ms.Free; end; finally httpCli.Free; end; end; Share this post Link to post
Olli73 4 Posted Sunday at 10:08 AM What did you install / configure on Apache server side to accept uploading files? Share this post Link to post
KimHJ 3 Posted Monday at 12:12 AM (edited) I installed Apache and then in the conf/ httpd.conf then i sat the DocumentRoot "C:/myfolder" and <Directory "C:/myfolder" > , AllowOverride All. I can see the Directory from another computer using a web browser and I can open the existing files. My problem is I don't know if I'm using the right way to save the image, I have been searching, all the example is see is mostly programmers that want add other thing to the files or they are using Indy. Edited Monday at 12:16 AM by KimHJ Share this post Link to post
Olli73 4 Posted Monday at 03:29 AM Download works out of the box, upload not. You must have a PHP Script, a CGI, a ISAPI dll or an own server to be able to upload files. Share this post Link to post
KimHJ 3 Posted Monday at 06:03 PM Ok, I will have to install PHP on the local computer where i have Apache running, then add it in the LoadModule. I found this script in w3schools.com that i will place in the folder, I change the max size from 50000 to 2000000. <?php $target_dir = "myfolder/"; $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]); $uploadOk = 1; $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION)); // Check if image file is a actual image or fake image if(isset($_POST["submit"])) { $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]); if($check !== false) { echo "File is an image - " . $check["mime"] . "."; $uploadOk = 1; } else { echo "File is not an image."; $uploadOk = 0; } } // Check if file already exists if (file_exists($target_file)) { echo "Sorry, file already exists."; $uploadOk = 0; } // Check file size if ($_FILES["fileToUpload"]["size"] > 2000000) { echo "Sorry, your file is too large."; $uploadOk = 0; } // Allow certain file formats if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif" ) { echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed."; $uploadOk = 0; } // Check if $uploadOk is set to 0 by an error if ($uploadOk == 0) { echo "Sorry, your file was not uploaded."; // if everything is ok, try to upload file } else { if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) { echo "The file ". htmlspecialchars( basename( $_FILES["fileToUpload"]["name"])). " has been uploaded."; } else { echo "Sorry, there was an error uploading your file."; } } ?> Now my question how to execute the php script from the Delphi Android app, again when I search I only see Indy examples, I don't know if Indy works on Android. Thanks. Share this post Link to post
Rollo62 536 Posted Tuesday at 03:45 PM You could fumble around with thwe RestDebugger tool, integrated in Delphi Tools https://docwiki.embarcadero.com/RADStudio/Athens/en/REST_Debugger_Tool When you're happy with this, you can generate and save the Delphi-Components with the right setup, to use 1:1 in Delphi. Share this post Link to post
KimHJ 3 Posted Tuesday at 04:34 PM I have used RestDebugger a lot, but I never tried to call a php script from it. I did find this https://www.linkedin.com/pulse/sending-data-between-embarcadero-delphi-fmx-apps-using-serge-pilko-lo06f/ I will try to if I can get it to work, my first try it timed out. Share this post Link to post
KimHJ 3 Posted Thursday at 01:17 AM Ok it works, just had to open the port in the firewall. Share this post Link to post