SubirArchivoController.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <?php
  2. namespace v1\controllers;
  3. use common\data\Respuesta;
  4. use common\rest\AuthController;
  5. use Ramsey\Uuid\Uuid;
  6. use v1\models\Media;
  7. use Yii;
  8. use yii\db\Expression;
  9. use yii\web\NotFoundHttpException;
  10. use yii\web\Response;
  11. use yii\web\UploadedFile;
  12. class SubirArchivoController extends AuthController {
  13. public function actionGuardar() {
  14. if (!$this->req->isPost) {
  15. throw new NotFoundHttpException();
  16. }
  17. $usuario = $this->usuario;
  18. $transaccion = \Yii::$app->db->beginTransaction();
  19. try {
  20. $this->res->format = Response::FORMAT_JSON;
  21. $archivo = UploadedFile::getInstanceByName('archivo');
  22. if ($archivo === null) {
  23. $transaccion->rollBack();
  24. return (new Respuesta())
  25. ->esError()
  26. ->mensaje("No se recibió el archivo");
  27. }
  28. $sec = Yii::$app->getSecurity();
  29. $base = Yii::getAlias("@app") . "/web/assets/";
  30. $ruta = "recurso/";
  31. if (!is_dir($base . $ruta)) {
  32. mkdir($base . $ruta);
  33. }
  34. $ruta .= date("Y/");
  35. if (!is_dir($base . $ruta)) {
  36. mkdir($base . $ruta);
  37. }
  38. $ruta .= date("m/");
  39. if (!is_dir($base . $ruta)) {
  40. mkdir($base . $ruta);
  41. }
  42. $dominio = Yii::$app->getRequest()->getHostInfo() . "/assets/";
  43. do {
  44. $nombreArchivo = str_replace("-", "", $ruta . $sec->generateRandomString());
  45. if ($archivo->extension) {
  46. $nombreArchivo .= "." . $archivo->extension;
  47. }
  48. } while (is_file($base . $nombreArchivo));
  49. if (!$archivo->saveAs($base . $nombreArchivo)) {
  50. $transaccion->rollBack();
  51. return (new Respuesta())
  52. ->esError()
  53. ->mensaje("Ocurrió un problema al guardar el archivo");
  54. }
  55. $uuid = Uuid::uuid1();
  56. $modelo = new Media();
  57. if (strlen($archivo->name) > 255) {
  58. $transaccion->rollBack();
  59. return (new Respuesta())
  60. ->esError()
  61. ->mensaje("El nombre del archivo es demasiado largo (máximo 255 caracteres)");
  62. }
  63. $modelo->uuid();
  64. $modelo->creado = new Expression('now()');
  65. $modelo->idUsuario = $usuario->id;
  66. $modelo->uuid = $uuid->toString();
  67. $modelo->nombre = $archivo->name;
  68. $modelo->extension = $archivo->extension;
  69. $modelo->mimetype = $archivo->type;
  70. $modelo->ruta = $dominio . $nombreArchivo;
  71. $modelo->load($this->req->getBodyParams(), '');
  72. if (!$modelo->save()) {
  73. return (new Respuesta($modelo))
  74. ->mensaje("Hubo un problema al guardar Media");
  75. }
  76. $transaccion->commit();
  77. $modelo->refresh();
  78. // $modelo->save();
  79. return (new Respuesta())
  80. ->mensaje("Archivo subido correctamente")
  81. ->detalle($modelo);
  82. // ->detalle(["idUsuario" => $usuario->id, "uuid" => $sec->generateRandomString(), "nombre" => $archivo->name, "extension" => $archivo->extension, "ruta" => $dominio . $nombreArchivo ]);
  83. // ->detalle(["ruta" => $dominio . $nombreArchivo]);
  84. } catch (\Exception $e) {
  85. $transaccion->rollBack();
  86. return (new Respuesta())
  87. ->esError($e)
  88. ->mensaje("Hubo un error en el servidor");
  89. }
  90. }
  91. }