ruby on rails爬坑(三):图片上传及显示

Rails图片上传与显示 由于rails封装了表单中的file类型,从而使得它的上传和下载变的很简单,只需要调用上传的file表单对象[Tempfile]的read方法就可以轻松的得到所上传文件的二进制流。 其实一般的上传文件有保存与服务器端有两种方式,一种是直接将所上传的文件内容以二进制流的形式保存在 阅读详情

一,问题及思路

最近在用rails + react + mysql基本框架写一个cms + client的项目,里面涉及到了图片的上传及显示,下面简单说说思路,至于这个项目的配置部署,应该会在寒假结束总结分享一下。

rails中图片上传及显示要解决主要问题是:

  • 图片存在哪?
  • 图片格式大小?
  • 客户端怎么显示图片?

因为这是个小项目,估计最多1000张图片,最多占用空间1G,所以采取相对简便的方法:图片保存在rails的public文件夹里(也就是保存在部署该项目的主机中),如果图片比较多的话,还是推荐用亚马逊云提供的服务AWS S3(理解为一个硬盘,S3提供了接口给你存取东西,安全,管理方便)。

大概的思路是,前端通过<input type="file"/>选择文件,发送ajax请求到后端的controller,controller将请求的图片数据进行大小裁剪、类型转换后保存到本地指定的文件夹,同时将路径返回,用于显示图片。

二,实践

思路比较简单,所以话不多说,直接上代码:

前端代码整合在react写的一个图片上传组件里,image_uploader.js.jsx代码如下
var ImageUploader = React.createClass({
  getInitialState: function() {
    return {
      url: this.props.url
    };
  },
  onFileSelect: function(e) {
    var that = this;
    var files = e.target.files;
    if (files.length <= 0) {
      AlertModal.showWithProps("No file selected");
      return;
    }
    var data = new FormData();
    $.each(files, function(key, value) {
      data.append('file', value);
      data.append('type', that.props.type)
    });
    this.upload(data);
  },
  upload: function(data) {
    var that = this;
    if (!data) {
      return;
    } else {
      this.refs.filebtn.disabled = true;
      $("#loading-modal").modal('show');
      $.ajax({
        url: '/missions/upload_image',
        type: 'post',
        data: data,
        processData: false,
        contentType: false
      }).done(function(res){
        console.log(res);
        that.setState({url: res.url});        
      }).fail(function(err){
        console.log(err);
        AlertModal.showWithProps("Upload Failed");
      }).always(function(){
        $("#loading-modal").modal('hide');
        that.refs.filebtn.disabled = false;
      });
    }
  },
  handleUrlChange: function(e) {
    this.setState({url: e.target.value});
  },
  render: function() {
    var form_input_name = this.props.model + "[thumb]";
    var form_input_id = this.props.model+ "_thumb";
    return (
      <div className="image-uploader-inputs row">
        <div className="col-sm-8 image-input">
          <input className="form-control" name={form_input_name} id={form_input_id} ref="urlinput" value={this.state.url || ""} onChange={this.handleUrlChange}/>
        </div>
        <div className="btn btn-primary btn-file image-input-btn">
          <input type="file" onChange={this.onFileSelect} ref="filebtn"/>
        </div>
      </div>
    );
  }
});

效果图
上面的重点在于upload函数,源码是最好的文档,如果看源码需要太多注释的话,那肯定是我写的代码质量还不够高,请批评指出。

写这个的时候遇到两个问题:

  • 一,这个组件是用在_form.html.slim里的,这个表单是用于信息的录入的,大家对表单应该比较熟悉,既然要用在表单里,就是给这个组件作标识,标明name和id,代码片段如下(从上面的代码中截取):
var form_input_name = this.props.model + "[thumb]";
var form_input_id = this.props.model+ "_thumb";
<input className="form-control" name={form_input_name} id={form_input_id} ref="urlinput" value={this.state.url || ""} onChange={this.handleUrlChange}/>
  • 二,使用<input type="file"/>有一个普遍的问题,自带的UI不美观。
    自带的UI
    谷歌/百度“input file btn”会有许多解决方案,家里网速差就没细看。我的做法是把这个btn设为透明,相关的代码及css如下:
<div className="btn btn-primary btn-file image-input-btn">
  <input type="file" onChange={this.onFileSelect} ref="filebtn"/>
</div>
.image-input-btn {
    float: left;
    width: 15%;
    background-image: image-url("upload.png");
    background-size: 30px;
    background-position: center;
    background-repeat: no-repeat;
    input {
      //hide file input button
      width: inherit;
      opacity: 0;
    }
  }
接下来看看后端的代码:
def upload_image
    # => will resize later
    image_relative_path = "/assets/images/#{params[:type]}/#{Time.now.to_i}.png"
    image_path = File.expand_path(File.dirname(__FILE__) + '/../..') + "/public" + image_relative_path

    data = File.read(params[:file].path)
    img = File.new(image_path, "w+")
      if img
        img.syswrite(data)
      end
    img.close
    render json: {url: image_relative_path}
 end

代码同样简单,构建文件路径,保存文件,返回路径。因为开发进度的原因这里并没有对图片的大小和类型进行修改(为了减少数据传输量,在前端进行大小的修改比较合理),后面review这部分代码的时候会再更新这篇博客。

值得说说的是:

  • 图片命名的问题,采用了时间戳,命名不会重复,为了方便管理,将不同类型的图片存于不同的文件夹,但是只以时间戳命名可获取的信息太少,不利于运营人员管理,后期会再仔细考虑这个问题。
  • 存放路径问题,在后端代码里,rails能将图片存在rails项目文件夹的任何位置,但是客户端显示图片的时候,只能访问public文件夹里的内容,于是决定将图片存在public文件夹下。

三,总结及思考

完成这个功能不需要太久,但代码外的思考不少。图片小,甚至能用Git备份图片,也许不是长久之计,开始想念aws的好了,容灾交给aws处理最好不过了,后面试了一下AWS S3: ruby on rails爬坑(四):使用AWS S3存取数据。

希望自己写得越多,考虑得越远。

在家的第十天,日子过得还是那么快,终于还是有点慌。接触的东西越多,要学的就越多,兴奋之余隐隐感觉时间不够用。既然梦想着成为一名全栈工程师,就理应付出更多。

学一点,消化一点。
保持对所有技术的敬重和热爱。

上面算是自勉吧,加油,也祝写了一天代码的自己情人节快乐。

【TCAD】AlGaN 器件的Sentaurus仿真 否则,必须在 LatticeParameters Sentaurus Device 的参数文件中的部分。Sentaurus Device 有两个工具实例:第一个工具实例, sd_fdiv ,模拟正向偏置特性,第二个工具实例, sd_rviv ,模拟反向偏置特性直至击穿。对于牛顿求解器,通常应该将非线性迭代次数限制为一个足够小的值,例如 Iterations=20 ,同时通过指定非阻尼迭代次数高于允许的牛顿迭代次数来避免解的阻尼( NotDamped=30 )。晶胞中的 Ga-N 键为橙色。 阅读详情

相关推荐

Python小白避坑指南:用Ursina做3D图形,Entity的scale和color参数到底怎么调才不出错?

本文详细解析了Python Ursina引擎中Entity对象的scale和color参数调优技巧,帮助3D图形编程初学者避开常见陷阱。通过对比实验和典型场景分析,深入讲解三种缩放方式的区别、颜色定义的四种方法,以及参数组合的协同效应,助力开发者精准控制3D图形表现。

weixin_26782929的博客 412

rails--图片的使用

rails中使用图片有特定的书写格式 <a href='#' class='eth_connect' > <%= image_pack_tag('metamask.png', style: 'width: 24px; height: 24px') %> MetaMask </a> <%= image_pack_tag 'application.png', size: '16x10', alt: 'Edit Entry' %.

琳琳的博客 286

高频面波成像实战:从频散曲线到全波形反演

面波勘探是近地表工程勘察的重要手段,其核心原理在于不同频率的面波对地下介质的敏感深度不同,由此形成的频散曲线能够反映浅层剪切波速结构。相较于传统钻探与折射波法,高频面波成像具有无损、高效、对低速夹层敏感等优势,广泛应用于路基检测、空洞探测、滑坡调查等领域。在实际工程中,从野外采集的排列设计、震源选型,到频散谱提取与频散曲线反演,每一步都直接影响成像精度。然而频散反演受限于一维层状假设,难以刻画横向剧烈变化的地质体。全波形反演通过拟合完整波形信息,能够突破频散曲线的分辨率边界,获得更精细的近地表速度模型。本文

weixin_29090917的博客 270

ruby on rails aliyun oss上传图片并预览

获取token require 'json' require 'base64' require 'openssl' module Aliyun class AliyunOssToken def initialize @access_key_id = Rails.configuration.application['ALIYUN_OSS_ACCESS_KEY_ID'] ...

征途人生&梦 586

记录一下本地部署Dify的坑

1. 截止2025-3-4为止,请注意,不要直接拉Dify的1.0.0版本。请先试用0.15.3版本。1.0.0有一个bug需要解决。3. 请使用docker-ce 新版本,docker-engine等老版本可能会有部分容器启动脚本执行莫名报错。2. 注意,请使用docker-compose V2版本,或者V1较高版本,否则会导致解析官方yml模板错误。

哈利路亚的收藏夹 5346

PDD psnl_verification anti_content 生成顺序与环境校验说明

K不是明文 URL,而是从当前href再派生出来的一小段摘要值。页面 URL 变,K会跟着变但K不是直接肉眼可读的 URL 字串可以把它理解成“URL 的短摘要字段”。这一步是最容易被误解的地方。它吃进去的是压缩后的中间串不是直接吃环境字段它内部还带有长度预算 / 字符映射 / 位置处理逻辑所以最终看到的环境字段 bytes协议头deflate 压缩自定义编码多层叠加后的结果。先把字段总包做再把压缩结果转成raw再拼fTail最后走做字符级输出因此,当前看到的协议字段流。

码王吴彦祖的博客 69

ruby on rails 文件、图片上传

运行环境,Mac 、ubuntu                   rails 4.2.1 以前做过几次图片,文件上传的功能,但是每次做的时候都要重新想怎么做,汗。。。,还是记下来吧。  其他主流上传gem包carrierwave和paperclip 1.在页面添加form表单上传图片或者文件 =form_for :file ,:url=&gt; '/add_excel' do |...

iteye_4679的博客 692

hive get_json_object解析json结果为null咋办?

最近一位开发的同学在使用get_json_object函数对json数据解析的时候,出现了结果为null的问题,问题原因是sql语法导致的,那么今天就来详细介绍一下解析json函数的用法!最后还是提醒小伙伴们,在开发过程中,一定要注意sql语法格式的书写,避免一些意想不到的结果!

笑看风云路的博客 2308

ruby on rails 多图上传

ruby on rails 多图上传 一、首先说一下需要使用的插件以及gem包。 1.paperclip(gem,用于后台文件处理,是一个很强大的工具) 2.swfupload(js/swf插件,用于前端页面的文件选择与提交上传,自带进度条。) 二、运行环境 1.ruby 1.9.3-p194 2.rails 3.2 三、准备工作。 首先在项目中安装用于...

weixin_34034670的博客 163

使用 ChatGPT Store 里的工具给 ABAP 制作 Logo,效果一般

在编程领域中,Domain Specific Language(DSL)是一种特定于某一问题领域的计算机语言,诞生目的就是为了解决该领域特定类型的问题。在 ChatGPT 官网的 GPT Stores,也有很多已经预先配置完毕,专用于某一特定领域的 GPT 工具,OpenAI 将其分类如下。第三个问题是 Logo 的配色,提供蓝白,黑绿和灰黄,以及自定义调色板四种选择。这个 GPT 设计了四个问题,通过一问一答的方式,获得使用者想创建 Logo 的细节。这次的复杂度调成最低的 1,感觉还是有点花里胡哨的。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 507

EtherCAT主站SOEM -- 15 -- CIA402伺服驱动器子协议

以上就是EtherCAT主站SOEM – 15 – CIA402伺服驱动器子协议的内容。有不明白的地方欢迎留言;有建议欢迎留言,我后面编写文档好改进。创作不容,如果文档对您有帮助,记得给个赞。

常驻客栈的博客--嵌入式EtherCAT 2733

ruby on rails界面常用控件写法以及rails常用方法

在数据表中增加字段class CreateTpoolUserTypes < ActiveRecord::Migration def change create_table :tpool_user_types , id: false do |t| t.string :id,limit: 30 t.string :utype_name, limit: 50

ikesi的博客 3334

SAP-ABAP:SAP信贷管理核心:CL_UKM_BUPA_FACTORY类完整解析与实践指南

SAP信贷管理核心类CL_UKM_BUPA_FACTORY解析 CL_UKM_BUPA_FACTORY是SAP信贷管理(UKM)模块的核心类,作为业务伙伴信贷数据的中央控制台,它提供: 统一入口:标准化实例化客户/供应商信贷对象 主要功能: 获取单条/批量业务伙伴数据 安全保存数据变更 封装底层数据访问逻辑 典型应用场景: 信贷主数据批量维护 自动化限额调整 订单信贷实时检查 性能优化建议: 使用批量方法替代循环单条处理 合理设置字段选择 实施缓存策略 该类通过简洁API简化复杂信贷操作,是SAP信贷管理开

baidu_35680696的博客 1208

TOP项目复盘:构建Ruby on Rails社交网络应用

你是否曾在开发社交网络应用时面临用户认证复杂、关系模型设计混乱、实时交互性能瓶颈等问题?本文将以The Odin Project(TOP)课程体系为基础,全面复盘如何使用Ruby on Rails构建一个功能完善的社交网络应用。通过本文,你将掌握: - 基于Devise的用户认证系统实现 - 多模型关联的数据架构设计 - 高效的用户关系与内容交互机制 - 从开发到部署的全流程最佳实践 ## 项...

gitblog_00558的博客 1044

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Ruby on Rails 微博克隆项目指南

Ruby on Rails 微博克隆项目指南 项目介绍 本项目是基于Ruby on Rails 6实现的一个简易微博克隆应用。它允许用户发布推文(Tweet)、关注其他用户并查看他们的动态在自己的时间线上。借助Devise、image_processing等gem,项目简化了用户管理逻辑、图片处理及分页显示等功能。此应用旨在提供一个基础框架,演示如何构建一个具备社交媒体核心功能的Web应用。 项...

gitblog_01061的博客 766

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Rails Solutions: Ruby on Rails Made Easy

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版、作者信息和本声明。否则将追究法律责任。http://blog.youkuaiyun.com/topmvp - topmvpIn this book youll learn: *How to develop web applications quickly and easily with the Ruby on Rails frame

TopMVP 559

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

ruby on rails aliyun oss百度编辑器上传

html集成百度编辑器就很简单了,不过需要注意的是链接中,ruby on rails的链接默认action是操作名称,而百度编辑器也需要一个url参数action,所以需要把ueditor.all.min.js里面的get,post的action=改个名字,不如saction= 后台接收到图片,就用流式上传直接上传图片流,图片流上传查看: https://blog.youkuaiyun.com/tang0...

征途人生&梦 340

Rabel 开源论坛系统是什么?基于 Ruby on Rails 的社区软件全解析

Rabel 是一款基于 Ruby on Rails 框架构建的**开源论坛系统**,定位是轻量、可扩展的社区软件。它拥有主题发布、评论互动、频道分类、签到打卡、收藏关注、消息通知与后台管理等完整能力,界面为中文设计,非常适合搭建技术社区、兴趣小组或企业内部讨论板。如果你正在寻找一个"Rails 开源社区"的参考实现,Rabel 是值得研究的对象。 ## 为什么选择 Rabel:这款社区软件解决了

gitblog_00035的博客 330

ruby on rails_使用Ruby on Rails构建博客-第2部分

ruby on railsIn the first part of this tutorial you were able to set up a blog that accepts postings using a nice editor called Ckeditor. The format of our blog posts can be well formatted to suit our...

culiu9261的博客 423

深入解析Ruby on Rails框架:核心特性与实战技巧

Ruby on Rails作为全栈Web开发框架,通过MVC架构和约定优于配置原则显著提升开发效率。其核心组件Active Record实现对象关系映射(ORM),简化数据库操作,而Action Pack则处理Web请求与响应生成。在工程实践中,Rails的脚手架生成、自动化测试集成以及多级缓存机制等技术特性,使其特别适合快速构建企业级应用。热门的Rails技术如N+1查询优化、RESTful路由设计等,都是开发者需要掌握的关键技能。无论是初创公司还是大型企业,Rails都能提供稳定的技术支撑,特别是在电商

dengjuanshou7445的博客 362

ruby on rails爬坑(四):使用AWS S3存取数据

一,前言在上一篇博客ruby on rails爬坑(三):图片上传及显示中提到AWS S3,这篇博客将简单介绍如何在rails项目中使用AWS S3.二,步骤 在亚马逊云服务中心开通配置AWS S3服务 在Gemfile中添加aws-sdkgem 'aws-sdk', '~> 2' 在config/initializers文件夹下新建aws.rb(initializers文件夹下的内容在程序启动时会

沉淀 2554

CVE-2026-66066实战教程:Rails Active Storage图片上传RCE漏洞复现、检测与防御

摘要: CVE-2026-66066漏洞是Ruby on Rails框架中Active Storage组件的命令注入漏洞,攻击者通过篡改图片EXIF元数据(如Comment字段)注入恶意命令。由于漏洞利用合规图片文件(如JPG/PNG),可绕过传统上传校验(后缀、MIME、文件头),无需二次交互即可触发RCE,隐蔽性强。影响Rails 6.1至7.2的多个版本,需升级框架或关闭自动元数据分析功能修复。漏洞根因是未过滤EXIF数据直接拼接Shell命令,官方补丁改用参数化调用和白名单机制。复现环境需安装漏洞版

从零开始,掌握网络安全。提供全面的网络安全教程、攻防演练技巧和行业动态。 402

零代码起步:用Rails Girls Guides打造你的技术播客

你还在为分享技术见解找不到合适平台?想让编程经验转化为影响力却被复杂工具劝退?本文将带你用Rails Girls开源项目提供的现成工具链,零代码快速搭建个人技术播客平台,无需服务器配置,30分钟即可上线第一个节目。 读完本文你将获得: - 基于Rails Girls开源框架的播客网站完整搭建流程 - 无需编程基础的内容发布与管理技巧 - 利用现有社区资源扩展播客影响力的实用策略 - 从录制到上线

gitblog_00227的博客 1113

ruby on rails 上传gem

1、 gem 'carrierwave' gem 'mini_magick' 2、bundle install

bajiudongfeng的专栏 724

rails -使用mini_magick和carrierwave进行图片上传

使用mini_magick和carrierwave进行图片上传 相关Gem: https://github.com/jnicklas/carrierwave https://github.com/probablycorey/mini_magick 参考实例:https://github.com/diaspora/diaspora/blob/master/app/uploaders...

sunny blog 347
上一篇: ruby on rails爬坑(二):Active Record数据库查询
下一篇: ruby on rails爬坑(四):使用AWS S3存取数据
Sheldon_Law
博客等级 码龄11年 44粉丝 32原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值