在商品页面上传图片时调整图片大小
Resizing the image while uploading image in Item page
每当将图像上传到 Stock 项目页面时,我都必须将图像调整到正常大小并上传相同的副本。
如何覆盖上传功能以添加我的逻辑?
上传功能是PX.Web.UI
中PXImageUploader
控件的HandleUpload
。
您可以尝试覆盖该函数,然后将页面上的控件替换为您的控件。
另一种方法是在 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
});
}
}
每当将图像上传到 Stock 项目页面时,我都必须将图像调整到正常大小并上传相同的副本。
如何覆盖上传功能以添加我的逻辑?
上传功能是PX.Web.UI
中PXImageUploader
控件的HandleUpload
。
您可以尝试覆盖该函数,然后将页面上的控件替换为您的控件。
另一种方法是在 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
});
}
}