apiaccountupdateprofilebanner.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <?php
  2. /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  3. · ·
  4. · Update the profile banner ·
  5. · ·
  6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7. · ·
  8. · ·
  9. · Q V I T T E R ·
  10. · ·
  11. · https://git.gnu.io/h2p/Qvitter ·
  12. · ·
  13. · ·
  14. · ·
  15. · <o) ·
  16. · /_//// ·
  17. · (____/ ·
  18. · (o< ·
  19. · o> \\\\_\ ·
  20. · \\) \____) ·
  21. · ·
  22. · ·
  23. · Qvitter is free software: you can redistribute it and / or modify it ·
  24. · under the terms of the GNU Affero General Public License as published by ·
  25. · the Free Software Foundation, either version three of the License or (at ·
  26. · your option) any later version. ·
  27. · ·
  28. · Qvitter is distributed in hope that it will be useful but WITHOUT ANY ·
  29. · WARRANTY; without even the implied warranty of MERCHANTABILTY or FITNESS ·
  30. · FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for ·
  31. · more details. ·
  32. · ·
  33. · You should have received a copy of the GNU Affero General Public License ·
  34. · along with Qvitter. If not, see <http://www.gnu.org/licenses/>. ·
  35. · ·
  36. · Contact h@nnesmannerhe.im if you have any questions. ·
  37. · ·
  38. · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · */
  39. require_once INSTALLDIR . '/lib/util/tempfile.php';
  40. if (!defined('GNUSOCIAL')) {
  41. exit(1);
  42. }
  43. class ApiAccountUpdateProfileBannerAction extends ApiAuthAction
  44. {
  45. protected $needPost = true;
  46. /**
  47. * Take arguments for running
  48. *
  49. * @param array $args $_REQUEST args
  50. *
  51. * @return boolean success flag
  52. */
  53. protected function prepare(array $args=array())
  54. {
  55. parent::prepare($args);
  56. $this->format = 'json';
  57. $this->user = $this->auth_user;
  58. $this->cropW = $this->trimmed('width');
  59. $this->cropH = $this->trimmed('height');
  60. $this->cropX = $this->trimmed('offset_left');
  61. $this->cropY = $this->trimmed('offset_top');
  62. $this->img = $this->trimmed('banner');
  63. return true;
  64. }
  65. /**
  66. * Handle the request
  67. *
  68. * @return void
  69. */
  70. protected function handle()
  71. {
  72. parent::handle();
  73. // see if we have regular uploaded image data
  74. try {
  75. $mediafile = MediaFile::fromUpload('banner', $this->scoped);
  76. } catch (NoUploadedMediaException $e) {
  77. // if not we may have base64 data
  78. $this->img = str_replace('data:image/jpeg;base64,', '', $this->img);
  79. $this->img = str_replace('data:image/png;base64,', '', $this->img);
  80. $this->img = str_replace(' ', '+', $this->img);
  81. $this->img = base64_decode($this->img, true);
  82. $fh = new TemporaryFile('gs-mediaupload');
  83. fwrite($fh->getResource(), $this->img);
  84. unset($this->img);
  85. fflush($fh->getResouce());
  86. $mediafile = MediaFile::fromFileInfo($fh, $this->scoped);
  87. unset($fh);
  88. }
  89. // maybe resize
  90. $width = $this->cropW;
  91. $height = $this->cropH;
  92. $scale = 1;
  93. if($width > 1200) {
  94. $scale = 1200/$width;
  95. } elseif($height > 600) {
  96. $scale = 600/$height;
  97. }
  98. $width = round($width*$scale);
  99. $height = round($height*$scale);
  100. // crop
  101. try {
  102. $imagefile = ImageFile::fromFileObject($mediafile->fileRecord);
  103. unset($mediafile);
  104. // We're just using the Avatar function to build a filename here
  105. // but we don't save it _as_ an avatar below... but in the same dir!
  106. $filename = Avatar::filename(
  107. $this->scoped->getID(),
  108. image_type_to_extension($imagefile->preferredType()),
  109. null,
  110. 'banner-'.common_timestamp()
  111. );
  112. $imagefile->resizeTo(Avatar::path($filename), array('width'=>$width, 'height'=>$height, 'x'=>$this->cropX, 'y'=>$this->cropY, 'w'=>$this->cropW, 'h'=>$this->cropH));
  113. $result['url'] = Avatar::url($filename);
  114. } catch (Exception $e) {
  115. $this->clientError(_('The image could not be resized and cropped. '.$e), 422);
  116. }
  117. // save in profile_prefs
  118. try {
  119. Profile_prefs::setData($this->scoped, 'qvitter', 'cover_photo', $result['url']);
  120. } catch (ServerException $e) {
  121. $this->clientError(_('The image could not be resized and cropped. '.$e), 422);
  122. }
  123. // return json
  124. $this->initDocument('json');
  125. $this->showJsonObjects($result);
  126. $this->endDocument('json');
  127. }
  128. }