Beispiel #1
0
        public ActionResult <dynamic> PostImages([FromBody] dynamic requestBody)
        {
            string authorization = Request.Headers["Authorization"];
            string token         = authorization.Substring("Bearer ".Length).Trim();

            Int16     userId = _userService.GetUserId(token);
            view_user user   = _contextForView.view_user.FirstOrDefault(x => x.id == userId);

            if (user == null)
            {
                throw new MindnoteException("你不是帳號的擁有者", HttpStatusCode.NotFound);
            }
            GoogleCredential gc     = GoogleCredential.FromJson(_GCSCredential);
            StorageClient    client = StorageClient.Create(gc);

            for (int i = 0; i < requestBody.base64Files.Count; i++)
            {
                //check all file content type;
                string contentType = requestBody.base64Files[i].contentType.Value;
                if (!contentType.StartsWith("image/"))
                {
                    throw new MindnoteException("你上傳了非圖片的檔案");
                }
            }

            // post to gcs
            List <dynamic> result = new List <dynamic>();

            for (int i = 0; i < requestBody.base64Files.Count; i++)
            {
                //check all file content type;
                string  base64Data       = requestBody.base64Files[i].data.Value;
                string  contentType      = requestBody.base64Files[i].contentType.Value;
                string  clientSideFlagId = requestBody.base64Files[i].clientSideFlagId != null ? requestBody.base64Files[i].clientSideFlagId.Value : "";
                decimal width            = -1;
                if (requestBody.base64Files[i].width != null)
                {
                    width = (decimal)requestBody.base64Files[i].width.Value;
                }
                decimal height = -1;
                if (requestBody.base64Files[i].height != null)
                {
                    height = (decimal)requestBody.base64Files[i].height.Value;
                }

                int nodeId = -1;
                if (requestBody.base64Files[i].nodeId != null)
                {
                    nodeId = (int)requestBody.base64Files[i].nodeId.Value;
                }
                string extensionFilename = ".jpg";
                if (contentType == "image/jpg" || contentType == "image/jpeg")
                {
                    extensionFilename = ".jpg";
                }
                else if (contentType == "image/png")
                {
                    extensionFilename = ".png";
                }
                else if (contentType == "image/gif")
                {
                    extensionFilename = ".gif";
                }
                else if (contentType == "image/bmp")
                {
                    extensionFilename = ".bmp";
                }
                else
                {
                    extensionFilename = contentType.Replace("image/", "");
                }
                string id = Guid.NewGuid().ToString("N");

                MemoryStream stream = new MemoryStream(Convert.FromBase64String(base64Data));
                Decimal      size   = stream.Length;
                if ((user.storage_usage + size) / 1024 / 1024 > 200)
                {
                    throw new MindnoteException("上傳的圖片已經超過免費使用者的上限 (200 M),只要每月 99 元,就能享有 100 倍的上傳空間", HttpStatusCode.ExpectationFailed);
                }
                else if ((user.storage_usage + size) / 1024 / 1024 / 1024 > 20)
                {
                    throw new MindnoteException("上傳的圖片已經超過付費使用者的上限 (20 G),請聯繫管理員 [email protected]", HttpStatusCode.InternalServerError);
                }
                Google.Apis.Storage.v1.Data.Object resultFromGCS = client.UploadObject(_GCSBucketName, id + extensionFilename, contentType, stream, new UploadObjectOptions()
                {
                    UserProject = _GCPProjectId,
                });
                JSONResponseStatus status = JSONResponseStatus.OK;
                if (resultFromGCS.Name == null)
                {
                    status = JSONResponseStatus.FAILED;
                }

                dynamic resultItem = new ExpandoObject();
                resultItem.status           = Enum.GetName(typeof(JSONResponseStatus), status);
                resultItem.filename         = resultFromGCS.Name;
                resultItem.clientSideFlagId = clientSideFlagId ?? "";
                resultItem.nodeId           = nodeId;
                resultItem.size             = resultFromGCS.Size;
                resultItem.width            = width;
                resultItem.height           = height;

                result.Add(resultItem);
            }

            // check gcs result and save local db
            for (int i = 0; i < result.Count; i++)
            {
                if (result[i].status == Enum.GetName(typeof(JSONResponseStatus), JSONResponseStatus.OK))
                {
                    image image = new image
                    {
                        owner_id = userId,
                        filename = result[i].filename,
                        size     = result[i].size,
                    };
                    if (result[i].width != -1)
                    {
                        image.width = result[i].width;
                    }
                    if (result[i].height != -1)
                    {
                        image.height = result[i].height;
                    }

                    if (result[i].nodeId != -1)
                    {
                        image.node_id = result[i].nodeId;
                    }

                    result[i].imageContext = image;
                    _context.image.Add(image);
                }
            }
            _context.SaveChanges();

            return(result);
        }
Beispiel #2
0
 public static string getJSONResponseText(JSONResponseStatus enumStatus)
 {
     return(enumStatus.ToString());
 }
Beispiel #3
0
 public JSONResponse(JSONResponseStatus status, dynamic data)
 {
     this.status = status;
     this.data   = data;
 }