65.9K
CodeProject 正在变化。 阅读更多。
Home

用于将图像复制/粘贴到 Web 表单中的剪贴板 ActiveX

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.75/5 (9投票s)

2008年5月11日

CPOL

3分钟阅读

viewsIcon

171437

downloadIcon

3976

一篇关于在 Web 表单上使用图像复制/粘贴的文章

引言

我的客户要求之一是在 Web 表单上使用 Windows 的复制/粘贴功能处理图像。 客户希望使用 CTRL+V 在客户端机器或剪贴板上粘贴任何图像。 我只是做了一些谷歌搜索,找到了一些执行单个任务的模块。 我根据我的要求对它们进行了修改。 ActiveX 提供了以下功能

  • 从客户端机器复制图像文件并将其粘贴到我们的 Web 表单中
  • 将该图像上传到我们的服务器上
  • 使用任何图像内容,例如 Microsoft Paint 来使用任何图像的裁剪部分,或者打印屏幕等。

注意:我的要求是在表单上使用多个 DIV 来使用这些功能,因此您将在演示项目的 JavaScript 代码中找到一些条件。

要求

由于这是一个非常基本的 ActiveX 控件,因此尚未签名。 因此,为了使用此 activeX,您需要将您的站点添加到“受信任站点”,并降低您的浏览器安全级别,以便您的浏览器暂时可以使用未签名的 ActiveX 控件。

您可以通过转到 工具 >> 选项 >> 安全性 >> 受信任站点 来执行此操作。

如果您要将图像上传到服务器,您的网站需要一个名为 Upload 且具有适当权限的文件夹。

Using the Code

整个实现完全使用了 JavaScript。 我在这里向您展示重要的部分。 表单的 BODY 标签正在调用 KeyPress() 事件,该函数调用 fnCall() 函数,该函数执行复制/粘贴的核心操作。

演示项目的代码说明

HttpUtil1.aspx 页面用于将粘贴的图像上传到服务器。 postVar 用于将查询 string 值传递给该 httpUtil 页面,id 用于在 Upload 文件夹下创建一个子文件夹,并将文件上传到其中。 您可以使用任何生成的随机数来创建不同的文件夹。

 strURL = strURL + "/HttpUtil1.aspx";
                        postVar = "id=1";

此 ActiveX 在客户端机器上创建临时文件。 仅当用户未复制任何现有图像(例如 Paint 剪切或打印屏幕等)时才会创建文件。 创建这些文件的路径可以从下面的代码中配置

// Getting the Physical path on which the images will be stored on client machine.
var PhysicalPathForTempImage = "c:\\Amit\\";

下面是调用 ActiveX 方法以创建并将剪贴板图像保存到客户端机器上的方法,稍后可以将其上传到服务器。

var strFilePath = objActiveX.getCopiedImage(PhysicalPathForTempImage);

将图像粘贴到 DIV 中后,我们可以使用相同的 ActiveX 将其上传到服务器。 我们无法直接使用任何服务器代码或 JavaScript 上传图像,因为我们手头只有 fileName,而不是包含图像流之类的 fileUpload 对象。 因此,该上传逻辑已转移到 ActiveX 逻辑中。

response = objActiveX.UploadFiles(strFileName,strURL,postVar);

ActiveX 项目的代码说明

我已将基本 USE32 用于剪贴板操作,将 kernel32 用于 GlobalAllocGlobalFreeGlobalLock 等。

' Clipboard routines.
Private Declare Function OpenClipboard Lib "USER32" (ByVal hWnd As Long) As Long
Private Declare Function CloseClipboard Lib "USER32" () As Long
Private Declare Function SetClipboardData Lib "USER32" _
    (ByVal wFormat As Long, ByVal hMem As Long) As Long
Private Declare Function GetClipboardData Lib "USER32" (ByVal wFormat As Long) As Long

' Global memory routines.
Private Declare Function GlobalAlloc Lib "kernel32" _
    (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" _
    (Destination As Any, Source As Any, ByVal Length As Long)

下面是调用 SaveAsJPG 模块将图像内容保存到图像文件中的方法。 这会以非常压缩的大小保存文件,与我们使用 VB 6.0 的 SavePicture() 方法不同,后者保存的文件大小约为 2-3 MB,而此模块保存的文件大小约为 60-80 KB。

Call SaveAsJPG.SaveJPG(Clipboard.GetData(vbCFBitmap), strTargetFilePath)

为了上传粘贴的图像,此 ActiveX 方法向 httpUtil.aspx 页面发送一个 HTTP Request 以将图像内容保存到服务器。

Function UploadFiles(strFileName1 As String, strUrl As String, _
    Optional postVar As String, _
    Optional strUserName As String, Optional strPassword As String) As String

' Set the user name and password.
        WinHttpReq.SetCredentials strUserName, strPassword, _
        HTTPREQUEST_SETCREDENTIALS_FOR_SERVER

关注点

当我开始将不同的模块合并到 ActiveX 中时,我丢失了用于以压缩模式保存图像的模块的链接,因此我的图像生成了很大的尺寸。 我搜索了很多来获取那个模块。 最后,我从几个月前浏览的 Google 历史记录中找到了它。 感谢 Google 保留了我的浏览链接。

历史

  • 2008 年 5 月 11 日:初始帖子
© . All rights reserved.