LostKobrakai Posted October 3, 2015 Posted October 3, 2015 The module is working quite nicely, but I cannot click on the file in the backend anymore even though I'm superuser and editor, which I gave download from admin rights. Edit: Would it be possible to look at the ListerPro styling for the field? 1
Wanze Posted October 9, 2015 Author Posted October 9, 2015 The module is working quite nicely, but I cannot click on the file in the backend anymore even though I'm superuser and editor, which I gave download from admin rights. I can't reproduce this problem here locally, with the latest dev version. Could you tell me the Pw version and Browser? Thanks! Edit: Would it be possible to look at the ListerPro styling for the field? Of course. I also fixed the bug with the help of your solution on GitHub. I'll add some more options to the module and will push everything on GitHub this evening or tomorrow.
LostKobrakai Posted October 9, 2015 Posted October 9, 2015 I've gone back to a normal file field by now, as the site needs to work fully on monday, but it was 2.6.17/19 and Chrome.
Juergen Posted December 2, 2015 Posted December 2, 2015 Another problem: Cannot upload files with the latest version 1.0.1 of secure files. I have detected that upload of files is no longer possible with this field type in my case. I cannot point out the exact time when this problem starts because I havent upload secure files for a longer time. In the meantime I have updated PW more times. The upload has worked in the past but now I get the error message, that the folder doesnt exist or is not writeable. I store all the files in the folders var/securefiles and these folders exist: All folders has the permission 777 for testing purposes My settings of the input field: And this is what I got if I had tried to upload a file: Help would be appreciated Best regards
Wanze Posted December 2, 2015 Author Posted December 2, 2015 Hi Juergen, v 1.0.1 works fine here on the latest dev. What version of ProcessWire are you using? From your screenshots it looks like the "var" folder is inside the root folder of ProcessWire. You should create your folder "securefiles" inside /var/, which lies on the root of your harddisk, outside of the web-root. Not sure if this is the problem, as you pointed out that everything worked before. But the message you're seeing is an exception of my module, thrown here: https://github.com/wanze/FieldtypeSecureFile/blob/master/FieldtypeSecureFile.module#L69 This indicates that the folder does not exist or is not writable. Cheers
Juergen Posted December 3, 2015 Posted December 3, 2015 Hello Stefan, I am using the latest dev 2.7.2 and PHP 5+. The var-folder is in the root, but this was not a problem at all. Here are some screenshots of uploaded files in the past, which are still located in the folder: As you can see the files are still there. As I pointed out - the folders have permission 777 (only for testing) so they are writeable in any case and they are still there. Best regards Jürgen
LostKobrakai Posted December 3, 2015 Posted December 3, 2015 Are you sure that you ftp program does show the full path? What's the output of $config->paths->root? I can hardly imagine a server to have the full filesystem in the webroot. 2
Wanze Posted December 3, 2015 Author Posted December 3, 2015 Hi Jürgen, As LostKObrakai says, I guess your FTP programm shows the directory of your web-root as root, so the path you entered in the config is not correct. The purpose of this module is that the files are stored outside of the web root. From your screenshot it looks like your "var" folder is beside ProcessWire's "site" folder, this would still be inside your web-root. 1
Juergen Posted December 3, 2015 Posted December 3, 2015 Thanks Wanze and LostKobrakai, I changed the path to /home/.sites/24........ (absolute path) and now it works. It was a path problem. Why it works in the past with the old path - ?? Problem solved! Best regards 1
Ralf Posted March 6, 2016 Posted March 6, 2016 Hello together, I´m a bit confused about doing the output of the securefile respectively securefiles... Wanze wrote this code: if ($input->get->download == 1) { $yourSecureFile->download(); } Now I'm a little overstrained and need your help. I build a template at the frontend for secure files and I generate the current output with this code $content = $page->body; $pdffiles = wire("page")->file; foreach ($pdffiles as $pf) { $content .= "<a href='' title='{$pf->name}'>$pf->name</a> ($pf->filesizeStr)<br />"; } but how can I now tell this link which of the secure files the user wants? This is the current output... Thank you for any hint Ralf
Wanze Posted March 7, 2016 Author Posted March 7, 2016 Hi Ralf, I would do this by passing the internal position of the file in the array, e.g. foreach ($pdffiles as $i => $pf) { $content .= "<a href='{$page->url}?fid={$i}' title='{$pf->name}'>$pf->name</a> ($pf->filesizeStr)<br />"; } Then you can grab the file with this ID: if ($input->get->fid) { $file = $page->file->eq((int) $input->get->fid); if ($file) { $file->download(); } } Cheers 1
LostKobrakai Posted March 7, 2016 Posted March 7, 2016 @Ralf That's exactly the key of this module. There is no url associated with each file, hence the secure nature. You can only "request" the file to be sent to the browser by $file->download() in your code. How the user can request the file from the website is up to you, like Wanze showed above. 1
renobird Posted March 16, 2016 Posted March 16, 2016 Hey Wanze, Are the files for individual pages stored in a directory named the same as the page ID — like a core files field? #lazyweb
LostKobrakai Posted March 16, 2016 Posted March 16, 2016 Yep. It's essentially moving the files folder to a non accessable folder. Everything inside the folder does stay the same. 3
Wanze Posted March 16, 2016 Author Posted March 16, 2016 @reno Yep, it also respects the $config->pagefileExtendedPaths setting, e.g. it creates a folder for each page ID or a nested folder structure, if the setting is enabled. Cheers 4
renobird Posted March 17, 2016 Posted March 17, 2016 Perfect. I have a few different scenarios right now that need secure files. I think this module will handle at least one of them seamlessly. Much appreciated Wanze! 1
Wanze Posted March 17, 2016 Author Posted March 17, 2016 I think this module will handle at least one of them seamlessly. You're welcome! Let me know if you need additional features that would fit into this module. 2
bernhard Posted April 30, 2016 Posted April 30, 2016 hi wanze, would it be possible to change the markup a little bit? i got a message that my sorting module ( https://processwire.com/talk/topic/13064-inputfieldfile-image-sorting-autosorting/ ) does not work with your securefile fieldtype. the problem is, that my module sorts the files based on the selector: tinysort(field.find('li.InputfieldFileItem'), {selector:'a.InputfieldFileName', attr:'title', order:direction}); and you are modifying this markup here: https://github.com/wanze/FieldtypeSecureFile/blob/master/FieldtypeSecureFile.module#L98 one solution would be to create a different selector for your fieldtype... i failed when trying to find a solution. would it be possible to modify your markup to an anchor: <a class="InputfieldFileName" title="thefilename.ext">...</a> thanks 1
LostKobrakai Posted June 2, 2016 Posted June 2, 2016 This might be useful to anyone trying to convert a (single) existing file field to a secure one, while maintaining integrity of other file fields on the same pages. Put a file with this content in pw's root directory and run it from the terminal: <?php include "index.php"; // allow for: $ php filename.php fieldName $fieldName = !empty($argv[1]) ? $argv[1] : 'file'; $field = $fields->get($fieldName); $usedInTemplates = $field->getTemplates(); $fp = fopen('files.txt', 'w'); // the use() statement allows for both pre and post pw 3.0 usage without change/compiler $eachPageUncache = function($selector, callable $callback) use ($pages) { $num = 0; $id = 0; while (true) { $p = $pages->get("{$selector}, id>$id"); $id = $p->id; if(!$id) break; $callback($p); $pages->uncacheAll($p); $num++; } return $num; }; try { // Alternatively use findMany and a foreach on PW 3.0.19+ $eachPageUncache("template=$usedInTemplates, include=all, check_access=0", function($page) use($fp, $fieldName, $config) { $files = $page->getUnformatted($fieldName); foreach ($files as $file) { $path = str_replace($config->paths->files, '', $file->pathname); fwrite($fp, $path . PHP_EOL); } }); } finally { // PHP 5.5+ fclose($fp); } Then you can use the created files.txt to copy files to their new location (add --remove-source-files to also remove the source files). rsync -v \ --files-from=PW_ROOT_PATH/files.txt \ PW_ROOT_PATH/site/assets/files NEW_LOCATION_PATH Switch the file field to be a secure file field and all files should still work. 5
k07n Posted March 2, 2017 Posted March 2, 2017 Is it possible to use relative paths in storageLocation? I have different environment on local/live servers and it would be nice to have same value. Something like this: //$storageLocation = rtrim($field->get('storageLocation'), '/') . '/'; $storageLocation = realpath($field->get('storageLocation')) . DIRECTORY_SEPARATOR; 1
Wanze Posted March 2, 2017 Author Posted March 2, 2017 @k07n Makes sense, I will update this and release a new version tomorrow. Cheers 2
k07n Posted March 22, 2017 Posted March 22, 2017 On 03.03.2017 at 0:39 AM, Wanze said: @k07n Makes sense, I will update this and release a new version tomorrow. Cheers @Wanze any success on this? 1
Wanze Posted March 24, 2017 Author Posted March 24, 2017 @k07n I tried to use realpath but it is failing to resolve my relative paths. How would you expect this to work, would you enter relative paths from the ProcessWire root or the document root? Could you give an example? Thanks. Cheers
k07n Posted March 26, 2017 Posted March 26, 2017 @Wanze I'm using $storageLocation = realpath(wire('config')->paths->root . $field->get('storageLocation')) . DIRECTORY_SEPARATOR; and ./../secure_files/ in Storage Location prefs. And I get "D:\osp\domains\secure_files\" on dev env and "/var/www/sitename/secure_files/" on live. 1
Wanze Posted March 26, 2017 Author Posted March 26, 2017 @k07n Thanks for the examples, i just pushed a commit to the master branch implementing this (version 1.0.2). Cheers 2
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now