You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React集成Dynamic Web TWAIN:扫描后如何向服务器传输文档数据

解决方案:Dynamic Web TWAIN 向服务器上传文档数据

Dynamic Web TWAIN 提供两种主流上传方式,可根据服务器接收逻辑选择:

一、使用内置HTTP上传API(推荐)

Dynamic Web TWAIN 自带HTTPUpload系列方法,无需手动处理数据格式,直接调用即可完成上传。

1. 补充服务器上传逻辑

在你的saveOrUploadImage函数末尾,添加_type === "server"的处理代码:

// 处理服务器上传逻辑
if (_type === "server") {
  const uploadUrl = "你的服务器上传接口地址";
  const fileName = saveFileName + "." + saveFileFormat;

  if (bMulti) {
    // 多页/多选场景
    if (props.selected.length === 1 || props.selected.length === props.buffer.count) {
      // 上传所有图像为多页文件
      switch (saveFileFormat) {
        case "tif":
          DWObject.HTTPUploadAllAsMultiPageTIFF(uploadUrl, fileName, onSuccess, onFailure);
          break;
        case "pdf":
          DWObject.HTTPUploadAllAsPDF(uploadUrl, fileName, onSuccess, onFailure);
          break;
        default:
          // 单页格式逐个上传
          for (let i = 0; i < props.buffer.count; i++) {
            const singleFileName = fileName.replace(".", `_${i}.`);
            DWObject.HTTPUpload(uploadUrl, singleFileName, i, fileType, onSuccess, onFailure);
          }
          break;
      }
    } else {
      // 上传选中的图像为多页文件
      switch (saveFileFormat) {
        case "tif":
          DWObject.HTTPUploadSelectedImagesAsMultiPageTIFF(uploadUrl, fileName, onSuccess, onFailure);
          break;
        case "pdf":
          DWObject.HTTPUploadSelectedImagesAsMultiPagePDF(uploadUrl, fileName, onSuccess, onFailure);
          break;
        default:
          // 逐个上传选中的单页图像
          props.selected.forEach((index, idx) => {
            const singleFileName = fileName.replace(".", `_${idx}.`);
            DWObject.HTTPUpload(uploadUrl, singleFileName, index, fileType, onSuccess, onFailure);
          });
          break;
      }
    }
  } else {
    // 单页场景直接上传
    DWObject.HTTPUpload(uploadUrl, fileName, props.buffer.current, fileType, onSuccess, onFailure);
  }
}

2. 服务器接收示例(Node.js)

服务器需支持接收multipart/form-data格式文件,示例代码:

const express = require('express');
const multer = require('multer');
const app = express();
const upload = multer({ dest: 'uploads/' });

app.post('/upload', upload.single('RemoteFile'), (req, res) => {
  console.log('上传文件信息:', req.file);
  res.status(200).send('上传成功');
});

app.listen(3000, () => console.log('服务器运行在3000端口'));

二、自定义上传(Blob/Base64格式)

若需自定义请求头、参数,可先将图像转为Blob或Base64,再用fetch/axios发送请求。

1. Blob格式上传

// 单页图像转Blob并上传
DWObject.ConvertToBlob([props.buffer.current], fileType, (blob) => {
  const formData = new FormData();
  formData.append('file', blob, fileName);

  fetch('你的服务器上传接口', {
    method: 'POST',
    body: formData
  }).then(res => res.json())
    .then(() => {
      props.handleOutPutMessage(fileName + " uploaded successfully!", "important");
      setSaveFileName((new Date()).getTime().toString());
    }).catch(err => {
      props.handleException({ message: err.toString() });
    });
}, onFailure);

// 多页图像转Blob(仅TIFF/PDF)
if (saveFileFormat === 'pdf' || saveFileFormat === 'tif') {
  DWObject.ConvertAllToBlob(fileType, (blob) => {
    const formData = new FormData();
    formData.append('file', blob, fileName);

    fetch('你的服务器上传接口', {
      method: 'POST',
      body: formData
    }).then(res => res.json())
      .then(() => {
        props.handleOutPutMessage(fileName + " uploaded successfully!", "important");
        setSaveFileName((new Date()).getTime().toString());
      }).catch(err => {
        props.handleException({ message: err.toString() });
      });
  }, onFailure);
}

2. Base64格式上传

DWObject.GetImageBase64(props.buffer.current, fileType, (base64Str) => {
  // 去除Base64前缀(如"data:image/jpeg;base64,")
  const base64Data = base64Str.split(',')[1];
  
  fetch('你的服务器上传接口', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      fileName: fileName,
      data: base64Data
    })
  }).then(res => res.json())
    .then(() => {
      props.handleOutPutMessage(fileName + " uploaded successfully!", "important");
      setSaveFileName((new Date()).getTime().toString());
    }).catch(err => {
      props.handleException({ message: err.toString() });
    });
}, onFailure);

三、现有代码补充说明

你的当前代码仅收集了imagesToUpload,但未执行实际上传操作,需将上述上传逻辑补充到函数末尾。另外,保留你现有fileType的循环判断逻辑,确保其与saveFileFormat匹配即可。

内容的提问来源于stack exchange,提问作者Gibson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 15:50:50