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

在 JS 中多线程和异步上传扫描图像

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2013年3月15日

CPOL

3分钟阅读

viewsIcon

32200

downloadIcon

292

本文将向您展示如何通过嵌入 ImageCapture Suite 来提高图像上传/下载的效率。

引言

图像/文档上传和下载的性能很大程度上取决于网络质量,以及扫描图像大小、客户端机器的 CPU 和内存使用情况。但是,性能和安全性始终是衡量文档管理系统好坏的两个重要因素。

本文将向您展示如何通过嵌入 ImageCapture Suite 来提高图像上传/下载的效率。

背景

Dynamsoft ImageCapture Suite 是一个针对 Web 应用程序优化的图像采集和处理 SDK。它允许您从扫描仪、网络摄像头和其他 TWAIN/UVC/WIA 兼容设备捕获图像。如果您对 SDK 感兴趣,可以从 Dynamsoft 网站下载 30 天免费试用版

主要特点

  • 从扫描仪、网络摄像头和其他 TWAIN/WIA/UVC 兼容的成像设备捕获图像/文档。
  • 与主流浏览器兼容,包括 IE(32 位和 64 位)、Firefox、Chrome、Safari 和 Opera。
  • 编辑扫描图像:裁剪、更改图像大小、旋转、缩放、擦除等。
  • 将图像上传到各种位置 - 本地文件夹、FTP 站点、Web 服务器、数据库、SharePoint 库等。
  • 高效的图像上传和下载:支持多线程和异步。
  • 增强的安全性:支持 SSL 和 Windows/Forms/Basic 身份验证。
  • 支持的图像格式包括 BMP、JPEG、PNG、TIFF(单页和多页)和 PDF(单页和多页)。

扫描图像

ImageCapture Suite 允许您从扫描仪、网络摄像头和其他与 TWAIN、WIA 或 UVC 兼容的成像设备捕获图像。整个图像扫描过程可以通过硬编码扫描属性进行自定义,或者您可以将 IfShowUI 设置为 true 以激活源的用户界面。

function AcquireImageInner() {
 
    if (DW_DWTSourceContainerID == "")
        DWObject.SelectSource();
    else
        DWObject.SelectSourceByIndex(document.getElementById(DW_DWTSourceContainerID).selectedIndex);
    DWObject.CloseSource();
    DWObject.OpenSource();
    DWObject.IfShowUI = document.getElementById("ShowUI").checked;
 
    var i;
    for (i = 0; i < 3; i++) {
        if (document.getElementsByName("PixelType").item(i).checked == true)
            DWObject.PixelType = i;
    }
    DWObject.Resolution = Resolution.value;
    DWObject.IfFeederEnabled = document.getElementById("ADF").checked;
    DWObject.IfDuplexEnabled = document.getElementById("Duplex").checked;
    AppendMessage("Pixel Type: " + DWObject.PixelType + "<br />Resolution: " + DWObject.Resolution + "<br />");
 
    DWObject.IfDisableSourceAfterAcquire = true;
    DWObject.AcquireImage();
}

启用多线程进行图像上传

您可以调用 MaxInternetTransferThreads 属性来设置通过 HTTP(s) POST 上传图像时要使用的线程数。

当目标图像的大小相对较大时(例如 > 1MB),启用多线程非常有用。为了您的参考,我粘贴了下表,该表反映了多线程如何帮助加速图像上传的性能。数据由 Dynamsoft 的测试团队提供。

测试文件名 文件大小 线程数 = 5 线程数 = 1 改进
WebTK2.tif 219 KB 3550.67 毫秒 3113.83 毫秒 -14.03%
WebTK.tif 537 KB 7173.17 毫秒 7249.00 毫秒 1.05%
DWTUp1M.tif 1.57 MB 14712.20 毫秒 21581.00 毫秒 31.83%
Dynamic Web TWAIN 8.0.1 Trial.exe 10.1 MB 91461.20 毫秒 128403.40 毫秒 28.77%
Install2.zip 20.0 MB 178861.20 毫秒 258035.60 毫秒 30.68%

由于算法需要时间来分配资源,因此从上表中可以看出,使用多线程处理小图像(< 1 MB)不是一个好主意。

除了文件大小之外,在以下情况下最好使用 1 个线程

  • 客户端和服务器之间的网络状况不佳;
  • 客户端机器没有足够的内存/CPU。

启用异步

通过为您的应用程序启用异步,您可以在图像上传/下载过程中执行其他操作,例如扫描更多文档。

要激活该模式,您可以将 AsyncMode 属性设置为 true

function btnUpload_onclick() {
    if (!DW_CheckIfImagesInBuffer()) {
        return;
    }
    var DW_ActionPage = "SaveToFile.aspx";
    var i, strHTTPServer, strActionPage, strImageType;
    if (document.getElementById("txt_ExtraInfo")) {
        DWObject.ClearAllHTTPFormField();
        DWObject.SetHTTPFormField("ExtraInfo", document.getElementById("txt_ExtraInfo").value);
    }
    txt_fileName.className = "";
    DWObject.AsyncMode = true;
    DWObject.MaxInternetTransferThreads = 5;
    DWObject.AllowPluginAuthentication = false;
    strHTTPServer = DW_ServerName;
    DWObject.HTTPPort = DW_strPort;
    var CurrentPathName = unescape(location.pathname); // get current PathName in plain ASCII  
    var CurrentPath = CurrentPathName.substring(0, CurrentPathName.lastIndexOf("/") + 1);
    strActionPage = CurrentPath + DW_ActionPage; //the ActionPage's file path
   
    for (i = 0; i < 4; i++) {
        if (document.getElementsByName("ImageType").item(i).checked == true) {
            strImageType = i + 1;
            break;
        }
    }
 
    var uploadfilename = txt_fileName.value + "." + document.getElementsByName("ImageType").item(i).value;
    if (strImageType == 2 && document.getElementById("MultiPageTIFF").checked) {
        if ((DWObject.SelectedImagesCount == 1) || (DWObject.SelectedImagesCount == DWObject.HowManyImagesInBuffer)) {
            DWObject.HTTPUploadAllThroughPostAsMultiPageTIFF(
                strHTTPServer,
                strActionPage,
                uploadfilename
            );
        }
        else {
            DWObject.HTTPUploadThroughPostAsMultiPageTIFF(
                strHTTPServer,
                strActionPage,
                uploadfilename
            );
        }
    }
    else if (strImageType == 4 && document.getElementById("MultiPagePDF").checked) {
        if ((DWObject.SelectedImagesCount == 1) || (DWObject.SelectedImagesCount == DWObject.HowManyImagesInBuffer)) {
            DWObject.HTTPUploadAllThroughPostAsPDF(
                strHTTPServer,
                strActionPage,
                uploadfilename
            );
        }
        else {
            DWObject.HTTPUploadThroughPostAsMultiPagePDF(
                strHTTPServer,
                strActionPage,
                uploadfilename
            );
        }
    }
    else {
        DWObject.HTTPUploadThroughPostEx(
            strHTTPServer,
            DWObject.CurrentImageIndexInBuffer,
            strActionPage,
            uploadfilename,
            strImageType
        );
    }
    DW_TempStr = DW_TempStr + "<b>Upload: </b>";
    if (DW_CheckErrorString()) {
    }
}

SaveToFile.aspx.cs:操作页面用于接收图像数据并将其传输到您的 Web 服务器。

using System;
using System.IO;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
 
public partial class SaveToFile : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        String strExc = "";
        try
        {
            HttpFileCollection files = HttpContext.Current.Request.Files;
            HttpPostedFile uploadfile = files["RemoteFile"];
            String ExtraInfo = HttpContext.Current.Request.Form["ExtraInfo"];
            if (ExtraInfo != "")
            {
                String extraInfoPath = HttpContext.Current.Request.MapPath(".") + "/" + "extraInfo.txt";
                StreamWriter sw = File.CreateText(extraInfoPath);
                if (extraInfoPath != null)
                {
                    sw.Write(ExtraInfo);
                    sw.Close();
                }
            }
            String Path = System.Web.HttpContext.Current.Request.MapPath(".") + "/ImageScanned/";
            if (!Directory.Exists(Path))
            {
                Directory.CreateDirectory(Path);
            }
            uploadfile.SaveAs(Path + uploadfile.FileName);
        }
        catch (Exception exc)
        {
            strExc = exc.ToString();
            String strField1Path = HttpContext.Current.Request.MapPath(".") + "/" + "log.txt";
            StreamWriter sw1 = File.CreateText(strField1Path);
            if (strField1Path != null)
            {
                sw1.Write(strExc);
                sw1.Close();
            }
            Response.Write(strExc);
        }
    }
}

资源

完整的源代码可以从文章中下载。源代码中包含基本功能,例如在多线程中异步扫描和上传图像。

要使用试用许可证运行示例应用程序或自定义 Web 应用程序并添加更多功能(例如图像编辑、条形码识别和 OCR),您可以从 Dynamsoft 网站下载 ImageCapture Suite。
ImageCapture Suite 30 天免费试用版下载

在线演示也供您参考。
ImageCapture Suite 在线演示

© . All rights reserved.