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); }
public static string getJSONResponseText(JSONResponseStatus enumStatus) { return(enumStatus.ToString()); }
public JSONResponse(JSONResponseStatus status, dynamic data) { this.status = status; this.data = data; }