General developer forum

Generate Path for the image.

 
Picture of Hossein Poursaeedi
Generate Path for the image.
 

i upload image in my  plugin admin setting with :

admin_setting_configstoredfile
 
i need this uploaded image to use in my plugin and to create the path for it , i follow :
$context = context_system::instance();
$fs = get_file_storage();
$fs = get_file_storage();
$files = $fs->get_area_files($context->id, my_plugin, my_area, false, '', false);
$file = reset($files);

$url = moodle_url::make_pluginfile_url(
$file->get_contextid(),
$file->get_component(),
$file->get_filearea(),
$file->get_itemid(),
$file->get_filepath(),
$file->get_filename()
);

it will generate the path with my image name as i gave it during upload time, but when i use it in my plugin, notching shows.
during use it in url , it gives me "Error code: filenotfound" .
may i know your suggestion ?
if its depend on permission  and i need to show this image in public ,what i can do?

thanks
 
Average of ratings: -
Picture of Mark Johnson
Re: Generate Path for the image.
Core developersParticularly helpful MoodlersPlugin developers

Hi houssein, it sounds like you're still working on the same thing as in your other thread.  Did my reply there help you at all?

 
Average of ratings: -
Picture of Hossein Poursaeedi
Re: Generate Path for the image.
 

Hello Mark,
yup i read that and thank you for your reply , but the issue is, i know the name of the file and config data, my issue is generating path for it, lf you see my post here, i clearly mention what i did, but still can get the picture 

 
Average of ratings: -
Picture of Mark Johnson
Re: Generate Path for the image.
Core developersParticularly helpful MoodlersPlugin developers

So was I incorrect in suggesting that calling get_config to get the setting used by admin_setting_configstoredfile would give you the path for the file?  Can you post what it returns instead?

 
Average of ratings: -
Picture of Hossein Poursaeedi
Re: Generate Path for the image.
 

no , "get_config " only gives configuration data which store in config plugin , in db, and only store name of the file.
for path , need to generate it in Moodle and i have issue with  it 

 
Average of ratings: -
Picture of Mark Johnson
Re: Generate Path for the image.
Core developersParticularly helpful MoodlersPlugin developers

Ok, well it looks like you're along the right lines, if you post the actual line of code used to display the admin_setting_configstoredfile field, it would help in working out why the code you've posted above doesn't work.


 
Average of ratings: -
Picture of Hossein Poursaeedi
Re: Generate Path for the image.
 
this is setting part

$settings->add(new admin_setting_configstoredfile(
'my_plugin/my_name'
get_string('file', 'my_plugin'),
get_string('fileDes', 'my_plugin'),
'my_area'
));
 
Average of ratings: -
Picture of Mark Johnson
Re: Generate Path for the image.
Core developersParticularly helpful MoodlersPlugin developers

Try something like this, I think you might have gotten some of your arguments wrong:

$files = $fs->get_area_files($context->id, 'my_plugin', 'my_area', 0);
$file = reset($file);
$url = make_pluginfile_url($context->id, 'my_plugin', 'my_area', 0, $file->get_filepath(), $file->get_filename());
 
Average of ratings: -
Picture of Hossein Poursaeedi
Re: Generate Path for the image.
 

Thanks for your reply Mark,

it has same result of mine , i can get the path , but it gives error "Sorry, the requested file could not be found"
and even in image tag, cant show it.

is it any permission issu from moodleData folder?
as i know we store files in moodle data and make path in local plugin ?

 
Average of ratings: -
Picture of Hossein Poursaeedi
Re: Generate Path for the image.
 

beside that, the item Id for picture is always 0 in database , is it normal?

 
Average of ratings: -
Picture of Mark Johnson
Re: Generate Path for the image.
Core developersParticularly helpful MoodlersPlugin developers

You can specify the itemid as an optional 5th parameter for admin_setting_configstoredfile().  If you don't specify, it uses 0.

Can you do print_object($file), and post the output?

 
Average of ratings: -
Picture of Hossein Poursaeedi
Re: Generate Path for the image.
 

Array
(
    [f95256e9a98dabad8a7a1a6e7f766f2cbe65bd20] => stored_file Object
        (
            [fs:stored_file:private] => file_storage Object
                (
                    [tempdir:file_storage:private] => C:\xampp\htdocs\MOODLE\moodledata/temp/filestorage
                    [filesystem:file_storage:private] => file_system_filedir Object
                        (
                            [filedir:protected] => C:\xampp\htdocs\MOODLE\moodledata/filedir
                            [trashdir:protected] => C:\xampp\htdocs\MOODLE\moodledata/trashdir
                            [dirpermissions:protected] => 511
                            [filepermissions:protected] => 438
                        )

                )

            [file_record:stored_file:private] => stdClass Object
                (
                    [id] => 167
                    [contenthash] => ea852f03c19e4cddfa896582c960da33f15c6ebe
                    [pathnamehash] => f95256e9a98dabad8a7a1a6e7f766f2cbe65bd20
                    [contextid] => 1
                    [component] => my_plugin
                    [filearea] => my_area
                    [itemid] => 0
                    [filepath] => /
                    [filename] => gol.jpg
                    [userid] => 
                    [filesize] => 152437
                    [mimetype] => image/jpeg
                    [status] => 0
                    [source] => 1920x1080.jpg
                    [author] => Hossein PS
                    [license] => allrightsreserved
                    [timecreated] => 1516368864
                    [timemodified] => 1516368867
                    [sortorder] => 0
                    [referencefileid] => 
                    [repositoryid] => 
                    [reference] => 
                    [referencelastsync] => 
                )

            [repository:stored_file:private] => 
            [filesystem:stored_file:private] => file_system_filedir Object
                (
                    [filedir:protected] => C:\xampp\htdocs\MOODLE\moodledata/filedir
                    [trashdir:protected] => C:\xampp\htdocs\MOODLE\moodledata/trashdir
                    [dirpermissions:protected] => 511
                    [filepermissions:protected] => 438
                )

        )

)

 
Average of ratings: -
Picture of Mark Johnson
Re: Generate Path for the image.
Core developersParticularly helpful MoodlersPlugin developers

Ah, I just realised what's probably wrong.

pluginfile.php doesn't serve the file for you - it calls my_plugin_pluginfile() from your plugin's lib.php file.  You'll need to define this function - look at some existing plugins for examples.

In your case you probably just need to reconstruct the path from the function arguments, do $file = $fs->get_file_by_hash(sha1($path)); then send_stored_file($file);

 
Average of ratings: -
Picture of Hossein Poursaeedi
Re: Generate Path for the image.
 

Thanks for your reply Mark,
when i check different libs , i saw all using "send_stored_file" which internally use "send_file".
"send_file" make images headers to show it. but the issue is , in my plugin, i have many different images which i need to call (iv separate it by area) and i really didn't see in any libs call  pluginfile() .
let say in  template , moodle use "/theme/image.php/" to generate mage , is there any other image generator file like this which i pass path and get the images and print it out url in variable ?? (same as moodle template)


thanks

 
Average of ratings: -
Picture of Darko Miletić
Re: Generate Path for the image.
Core developersParticularly helpful Moodlers

Here is a fully working example of a plugin that serves it's own files

https://github.com/kiklop74/moodle-local_fooplug


It does contain it's own _pluginfile method.



 
Average of ratings: -
Picture of Darko Miletić
Re: Generate Path for the image.
Core developersParticularly helpful Moodlers

I also added example how to actually use the stored setting. See index.php.

 
Average of ratings: -
Picture of Hossein Poursaeedi
Re: Generate Path for the image.
 

Dear Darko ,
thanks for your nice job.
I do it same in my block lib and setting files and call it instead of setting , in some classes of my own block  . the issue is it generate the correct path and file name ,but unfortunately i receive "request file could not be found ".


ps. it generate bellow file :
<img src="http://localhost/MOODLE/moodle/pluginfile.php/1/my_plugin/my_area/0/apple.jpg" alt="This is my image!!!" />


 
Average of ratings: -
Picture of Darko Miletić
Re: Generate Path for the image.
Core developersParticularly helpful Moodlers

This ping-pong is pointless. If you want real help we need to see the complete code of your plugin since obviously you are doing something wrong. Upload it to github/bitbucket and let us see.

 
Average of ratings: -
Picture of Hossein Poursaeedi
Re: Generate Path for the image.
 

Thanks Darko, i found the issue .
it was because of filearea , when i use many "configstoredfile" in same setting pages.


thanks alot.

 
Average of ratings: -