问题描述
每当将图片上传到库存商品页面时,我都必须将图片调整为重磅大小并上传相同的副本。
解决方法
上传函数是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
});
}
}