Ruby on Rails服务器文件上传

最近看了下ruby on rails,试着把Dynamic Web TWAIN集成到ruby on rails中。这里分享下如何在rails中用几行代码搞定文件上传。

参考原文:How to Load, Scan and Upload Files with Ruby on Rails

作者:Desmond Shaw

翻译:yushulx

软件安装

在Windows上不要选择Ruby 2.2,不然在运行rails server的时候会报错:

nokogiri不支持,详情可以阅读https://github.com/sparklemotion/nokogiri/issues/1256

Rails创建工程的基本步骤

  1. 安装rails:

    gem install rails
  2. 创建应用:

    rails new dwt
  3. cd到dwt
  4. 启动服务
    rails server
  5. 访问http://localhost:3000

Rails集成Dynamic Web TWAIN上传文件

创建controller

rails generate controller twainscanning home

< Dynamic Web TWAIN directory >\Resources拷贝到< Rails Project >\public\Resources

打开< Rails Project >\app\views\twainscanning\home.html.erb添加下面的代码:

<html>
 
<head>
  <title>DWT with Ruby</title>
  <script type="text/javascript" src="Resources/dynamsoft.webtwain.initiate.js"></script>
  <script type="text/javascript" src="Resources/dynamsoft.webtwain.config.js"></script>
  <style>
    h1 {
      font-size: 2em;
      font-weight: bold;
      color: #777777;
      text-align: center
    }
    table {
      margin: auto;
    }
  </style>
</head>
 
<body>
  <h1>
            DWT with Ruby
  </h1>
  <table>
    <tr>
      <td>
        <!-- dwtcontrolContainer is the default div id for Dynamic Web TWAIN control.
                   If you need to rename the id, you should also change the id in dynamsoft.webtwain.config.js accordingly. -->
        <div id="dwtcontrolContainer"></div>
      </td>
    </tr>
 
    <tr>
      <td>
        <input type="button" value="Load Image" onclick="btnLoad_onclick();" />
        <input type="button" value="Scan Image" onclick="AcquireImage();" />
        <input id="btnUpload" type="button" value="Upload Image" onclick="btnUpload_onclick()">
      </td>
    </tr>
  </table>
 
  <!--Custom script goes here-->
  <script type="text/javascript">
    Dynamsoft.WebTwainEnv.RegisterEvent(‘OnWebTwainReady‘, Dynamsoft_OnReady);
    var DWObject;
 
    function Dynamsoft_OnReady() {
      DWObject = Dynamsoft.WebTwainEnv.GetWebTwain(‘dwtcontrolContainer‘); // Get the Dynamic Web TWAIN object that is embeded in the div with id ‘dwtcontrolContainer‘
      DWObject.Width = 480; // Set the width of the Dynamic Web TWAIN Object
      DWObject.Height = 640; // Set the height of the Dynamic Web TWAIN Object
    }
 
    function btnLoad_onclick() {
      var OnSuccess = function() {};
 
      var OnFailure = function(errorCode, errorString) {};
 
      DWObject.IfShowFileDialog = true;
      DWObject.LoadImageEx("", EnumDWT_ImageType.IT_ALL, OnSuccess, OnFailure);
    }
 
    function AcquireImage() {
      if (DWObject) {
        DWObject.IfShowUI = false;
        DWObject.IfDisableSourceAfterAcquire = true; // Scanner source will be disabled/closed automatically after the scan.
        DWObject.SelectSource(); // Select a Data Source (a device like scanner) from the Data Source Manager.
        DWObject.OpenSource(); // Open the source. You can set resolution, pixel type, etc. after this method. Please refer to the sample ‘Scan‘ -> ‘Custom Scan‘ for more info.
        DWObject.AcquireImage(); // Acquire image(s) from the Data Source. Please NOTE this is a asynchronous method. In other words, it doesn‘t wait for the Data Source to come back.
      }
    }
 
    function btnUpload_onclick() {
      DWObject.HTTPPort = 3000;
      var CurrentPathName = unescape(location.pathname); // get current PathName in plain ASCII
      var CurrentPath = CurrentPathName.substring(0, CurrentPathName.lastIndexOf("/") + 1);
      var strActionPage = CurrentPath + "upload/";
      var strHostIP = "localhost"; // server IP e.g. 192.168.8.84
 
      var OnSuccess = function(httpResponse) {
        alert("Succesfully uploaded");
      };
 
      var OnFailure = function(errorCode, errorString, httpResponse) {
        alert(httpResponse);
      };
 
      var date = new Date();
      DWObject.HTTPUploadThroughPostEx(
        strHostIP,
        DWObject.CurrentImageIndexInBuffer,
        strActionPage,
        date.getTime() + ".jpg",
        1, // JPEG
        OnSuccess, OnFailure
      );
    }
 
  </script>
 
</body>
 
</html>

打开< Rails Project >\app\controller\application_controler.rb注释掉:

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  #protect_from_forgery with: :exception
end

打开< Rails Project >\config\routes.rb 添加映射:

Rails.application.routes.draw do
  get ‘twainscanning/home‘
  root ‘twainscanning#home‘
  post ‘upload/‘ => ‘twainscanning#upload‘
end

打开< Rails Project >\app\controller\twainscanning_controller.rb添加文件上传代码:

class TwainscanningController < ApplicationController
  def home
  end
 
  def upload
    uploaded_io = params[:RemoteFile]
 
    upload_dir = Rails.root.join(‘public‘, ‘upload‘)
    unless Dir.exist?(upload_dir)
      Dir.mkdir(upload_dir)
    end
 
    File.open(Rails.root.join(‘public‘, ‘upload‘, uploaded_io.original_filename), ‘wb‘) do |file|
      file.write(uploaded_io.read)
    end
 
    respond_to do |format|
      format.html.any { render text: "Successfully uploaded!"}
    end
 
  end
end

运行服务:

源码

https://github.com/dynamsoftsamples/dwt-ruby-on-rails

时间: 2024-12-29 23:50:58

Ruby on Rails服务器文件上传的相关文章

微信企业号上传媒体文件之服务器文件上传

微信企业号上传媒体文件之服务器文件上传 企业在使用接口时,对多媒体文件.多媒体消息的获取和调用等操作,是通过media_id来进行的. 通过接口https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE,企业可以上传多媒体文件. 注意,每个多媒体文件(media_id)会在上传到微信服务器3天后自动删除,以节省服务器资源. 通常文件上传是通过html表单进行的,通过HttpURLConn

前后端分离跨服务器文件上传-Java SpringMVC版

近来工作上不上特别忙,加上对后台java了解一点,所以就抽时间,写了一个java版本的前后端分离的跨服务器文件上传功能,包括前后端代码. 一.Tomcat服务器部分 1.Tomcat服务器 单独复制一份Tomcat,用来作为文件服务器 1.1 xml文件: 需要在该Tomcat的conf目录下的web.xml文件的大概100行添加如下部分: 1.2 server.xml文件: 需要在该Tomcat的conf目录下的server.xml文件做一些端口的修改 1.3 Tomcat下建立文件夹 在该T

ruby on rails nginx 如何上传大文件?

用ruby on rails开发的web,用了carrierwave和dropzone实现了上传文件.但后来发现,一旦文件大于200M时,就不行了,特别慢,虽说carrierwave有个move_to_cache.move_to_store的选项,但好像起不了作用.于是又去研究其它的上传方式,之后发现nginx的upload module比较靠普,但这样做有一个问题就是nginx必须是编译安装的,要把upload module一块编译进行才能用.在这里记录一下实现的具体流程. 一.编译安装ngi

win服务器 文件上传下载出现“未指定的错误” 解决方法汇总

环境 WIN平台IIS服务器   经常出现于ASPX页面 汇总 1.权限问题 出现场景 : 基于ACCESS数据库   原因解析 : 1.首先需要排除自身问题,例如建表使用关键字,格式错误,插入数据与数据库类型不匹配等等 2.TEMP权限检查,当数据写入数据库的时候需要获取当前服务器权限只有设置了IIS的temp写入权限才能进行数据写入 解决办法 : 第一种解决方法:使用Ms Access里的“工具->数据库实用工具->压缩和修复数据库”来修复db/global.asa.如果修复后还是出错,请

springMvc---跨服务器文件上传(实测总结)

序言: 该案例是采用springMvc实现跨服务器图片上传功能,其中用到的主要类和工具有:CommonsMultipartResolver.jquery.form.js.如果要实现多个文件上传,只需要在input元素中加入multiple="multiple",即可选择多个文件进行上传.另外本文的上传的文件路径不是在tomcat下对应的文件夹中,而是在workspace对应的文件夹中存在.该案例使用ajax上传页面不刷新,多个图片可立即回显,并将其相对路径可以随着表单一起保存到数据库中

FTP服务器文件上传的代码实现

方式一: @Test public void testFtpClient() throws Exception { // 1.创建一个FtpClient对象 FTPClient ftpClient = new FTPClient(); // 2.创建ftp连接,默认是21端口 ftpClient.connect("192.168.1.121", 21); // 3.登录ftp服务器,使用用户名和密码 ftpClient.login("ftpuser", "

【Linux】本机与服务器文件互传、Linux服务器文件上传下载

一.Linux下文件互传,scp命令实例 1.Linux下目录复制:本机->远程服务器 scp -r /home/abc/test1 root@192.168.0.1:/home/bcd/test2  (本机目录路径    远程机用户名@IP:/目录) 2.Linux下目录复制:远程服务器->本机 scp -r root@192.168.0.1:/home/bcd/test2 /home/abc/test1 (远程机用户名@IP:/目录                本机目录路径) 3.Lin

python服务器文件上传下载+GUI【tkinter】

大概就是一个通过应用程序来和服务器打交道的这么一个,小东西 1.GUI 用的是tkinter 1 # -*- coding: UTF-8 -*- 2 from tkinter import * 3 import tkinter.filedialog 4 import requests 5 6 7 def Upload(): 8 print('upload') 9 selectFileName = tkinter.filedialog.askopenfilename(title='选择文件')#选

服务器文件上传下载(XShell+Xftp)

1.下载XShell安装包+Xftp安装包.百度网盘(XShell):https://pan.baidu.com/s/1eR4PFpS 百度网盘(Xftp):https://pan.baidu.com/s/1eSkNhia 2.打开XShell,新建会话.文件-->新建-->在弹出框中填写主机名等信息.在点击右侧菜单"用户身份验证" 填写用户名及密码.-->点击"连接"或者双击连接.在弹出框中选择"永久保存***". 3.安装X