1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
package FixMyStreet::App::Controller::Photo;
use Moose;
use namespace::autoclean;
BEGIN {extends 'Catalyst::Controller'; }
use DateTime::Format::HTTP;
=head1 NAME
FixMyStreet::App::Controller::Photo - Catalyst Controller
=head1 DESCRIPTION
Catalyst Controller.
=head1 METHODS
=cut
=head2 index
Display a photo
=cut
sub index :Path :Args(0) {
my ( $self, $c ) = @_;
my $id = $c->req->param('id');
my $comment = $c->req->param('c');
$c->detach( 'no_photo' ) unless $id || $comment;
my @photo;
if ( $comment ) {
@photo = $c->model('DB::Comment')->search( {
id => $comment,
state => 'confirmed',
photo => { '!=', undef },
} );
} else {
# GoogleBot-Image is doing this for some reason?
if ( $id =~ m{ ^(\d+) \D .* $ }x ) {
return $c->res->redirect( $c->uri_with( { id => $1 } ), 301 );
}
$c->detach( 'no_photo' ) if $id =~ /\D/;
@photo = $c->cobrand->problems->search( {
id => $id,
state => [ FixMyStreet::DB::Result::Problem->visible_states(), 'partial' ],
photo => { '!=', undef },
} );
}
$c->detach( 'no_photo' ) unless @photo;
my $photo = $photo[0]->photo;
if ( $c->req->param('tn' ) ) {
$photo = _resize( $photo, 'x100' );
} elsif ( $c->cobrand->default_photo_resize ) {
$photo = _resize( $photo, $c->cobrand->default_photo_resize );
}
my $dt = DateTime->now()->add( years => 1 );
$c->res->content_type( 'image/jpeg' );
$c->res->header( 'expires', DateTime::Format::HTTP->format_datetime( $dt ) );
$c->res->body( $photo );
}
sub no_photo : Private {
my ( $self, $c ) = @_;
$c->detach( '/page_error_404_not_found', [ 'No photo' ] );
}
sub _resize {
my ($photo, $size) = @_;
use Image::Magick;
my $image = Image::Magick->new;
$image->BlobToImage($photo);
my $err = $image->Scale(geometry => "$size>");
throw Error::Simple("resize failed: $err") if "$err";
my @blobs = $image->ImageToBlob();
undef $image;
return $blobs[0];
}
=head1 AUTHOR
Struan Donald
=head1 LICENSE
This library is free software. You can redistribute it and/or modify
it under the same terms as Perl itself.
=cut
__PACKAGE__->meta->make_immutable;
1;
|