首页 > 解决方案 > 在项目页面中上传图像时调整图像大小

问题描述

每当将图像上传到库存商品页面时,我都必须将图像调整为大尺寸并上传相同的副本。

如何覆盖上传功能以添加我的逻辑?

标签: acumatica

解决方案


上传功能是HandleUpload控制PXImageUploaderPX.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
        });
    }
}

推荐阅读