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 559 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 5 Posted November 17 What did you install / configure on Apache server side to accept uploading files? Share this post Link to post
KimHJ 3 Posted November 18 (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 November 18 by KimHJ Share this post Link to post
Olli73 5 Posted November 18 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 November 18 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 538 Posted November 19 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 November 19 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 November 21 Ok it works, just had to open the port in the firewall. Share this post Link to post