acumatica - 在项目页面中上传图像时调整图像大小
问题描述
每当将图像上传到库存商品页面时,我都必须将图像调整为大尺寸并上传相同的副本。
如何覆盖上传功能以添加我的逻辑?
解决方案
上传功能是HandleUpload
控制PXImageUploader
在PX.Web.UI
. 您可以尝试覆盖该功能,然后将页面上的控件替换为您的。
另一种方法是处理InventoryItemMaint
图表内的大小调整。您可以检查 ImageUrl 字段更新并在那里调整大小。每当您上传新图片时,URL 基本上都会更新。请不要在生产中使用下面的示例,因为它从未经过全面测试。
// Acuminator disable once PX1016 ExtensionDoesNotDeclareIsActiveMethod extension should be constantly active
public class InventoryItemMaintExt : PXGraphExtension<InventoryItemMaint>
{
public PXSelect<UploadFileRevision> uploadFileRevisions;
protected virtual void InventoryItem_ImageUrl_FieldUpdated(PXCache sender, PXFieldUpdatedEventArgs e, PXFieldUpdated baseMethod)
{
baseMethod?.Invoke(sender, e);
if(e.Row is InventoryItem row)
{
if ((string)e.OldValue != row.ImageUrl) //ADD conditions so that this doesn't work any time user change the image if there are multiple attached
{
UpdateImageFileRevisionToResizedImage(sender, row);
}
}
}
private void UpdateImageFileRevisionToResizedImage(PXCache sender, InventoryItem row)
{
var fileNotes = PXNoteAttribute.GetFileNotes(sender, row);
UploadFileRevision uploadedFile = GetFile(sender.Graph, fileNotes, row.ImageUrl);
if (uploadedFile != null)
{
var data = ResizeImage(uploadedFile.Data);
uploadedFile.Data = data;
uploadFileRevisions.Update(uploadedFile);
}
}
//WARNING: DON'T USE THIS METHOD IN PRODUCTION.
// USE ANY OTHER RECOMMENDED METHOD TO RESIZE IMAGES
private static byte[] ResizeImage(byte[] data)
{
System.IO.MemoryStream myMemStream = new System.IO.MemoryStream(data);
System.Drawing.Image fullsizeImage = System.Drawing.Image.FromStream(myMemStream);
System.Drawing.Image newImage = fullsizeImage.GetThumbnailImage(200, 200, null, IntPtr.Zero);
System.IO.MemoryStream myResult = new System.IO.MemoryStream();
newImage.Save(myResult, System.Drawing.Imaging.ImageFormat.Jpeg); //Or whatever format you want.
return myResult.ToArray(); //Returns a new byte array.
}
private static UploadFileRevision GetFile(PXGraph graph, Guid[] fileIds,string fileUrl)
{
return (UploadFileRevision)PXSelectBase<UploadFileRevision,
PXSelectJoin< UploadFileRevision,
InnerJoin <UploadFile,
On<UploadFile.fileID, Equal<UploadFileRevision.fileID>,
And<UploadFile.lastRevisionID, Equal<UploadFileRevision.fileRevisionID>>>>,
Where<UploadFile.fileID, In<Required<UploadFile.fileID>>,
And<UploadFile.name,Equal<Required<UploadFile.name>>>>>.Config>.Select(graph, new object[]
{
fileIds,
fileUrl
});
}
}
推荐阅读
- c# - 来自 ByteArray 的 ECDiffieHellmanPublicKey(使用 ECDiffieHellman NamedCurves)
- python - Python 异常 - 捕获除预期之外的所有异常
- wpf - 如何在wpf中向上显示组合框值
- c++ - mariadb make_query 卡在 make_query() 调用中
- c# - 遍历 umbraco 中的单选按钮选项
- java - 观察通过 Selenium 驱动程序实例执行的所有操作
- java - Java - Spring boot - 无法自动装配 - 找不到 bean
- java - DateRange 迭代错误(代码取自 SO)
- coordinate-systems - astropy / healpix中的ECEF帧?
- javascript - 如何为多个按钮调用相同的模式