Jump to content

FieldtypeSecureFile


Wanze

Recommended Posts

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? 

  • Like 1
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

  • 1 month later...

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:

post-2257-0-16116800-1449055064_thumb.pn

post-2257-0-00387700-1449055078_thumb.pn

All folders has the permission 777 for testing purposes

My settings of the input field:

post-2257-0-73767500-1449055134_thumb.pn

And this is what I got if I had tried to upload a file:

post-2257-0-22903500-1449055172_thumb.pn

Help would be appreciated

Best regards

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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:

post-2257-0-57066100-1449126130_thumb.pn

post-2257-0-70823700-1449126142_thumb.pn

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

Link to comment
Share on other sites

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.

  • Like 1
Link to comment
Share on other sites

  • 3 months later...

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...

post-644-0-04013300-1457296196_thumb.png

 
 
Thank you for any hint
Ralf
Link to comment
Share on other sites

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

  • Like 1
Link to comment
Share on other sites

@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.

  • Like 1
Link to comment
Share on other sites

  • 2 weeks later...

@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

  • Like 4
Link to comment
Share on other sites

  • 1 month later...

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

  • Like 1
Link to comment
Share on other sites

  • 1 month later...

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.

  • Like 5
Link to comment
Share on other sites

  • 8 months later...

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;

 

  • Like 1
Link to comment
Share on other sites

  • 3 weeks later...

@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

Link to comment
Share on other sites

@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.

  • Like 1
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...