`
hedahai119
  • 浏览: 106037 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

在Ruby on Rails 中用 xmlrpc 来传输附件(图片)

阅读更多

还是上次的需求,让做Bugzilla的WebService的扩展,Bugzilla的WebService API 中只有create bug的API(不带附件的),现在费让我做一个在创建的时候可以带attachment的API。

 

在网上找了下,没看到xmlrpc还可以传attachment的例子,都说可以传字符串,数字等基本类型。

 

但是我想传图片怎么整呢?

 

1.我先将图片转化成2进制流

2.再将2进制流转化成base64的字编码

3.用xmlrpc把base64编码传输过去(当string传过去)

4.在server端在base64给decode了

5.让后就可以直接当BLOB类型存入mysql数据库了

 

PS:我没考虑效率之类的,我就先找个方法来实现我的需求,因为把2进制流变成base64编码的时候文件在无形中就变大了。

 

代码如下:

 

1.erb文件

<% form_tag({:action=>'upload'},:multipart => true) do%>
      <label for="file">File to Upload</label> 
      <%= file_field_tag "file" %>
      <%=submit_tag "upload" %>
<% end %>
 

2.controller文件中

require "xmlrpc/client"
require "base64"
class SoapController < ApplicationController
  before_filter :get_XMLRPC_server
  
  def index
    @products_arr = get_products()
  end
  
  def rcp

    @result_1= @server.call("Bugzilla.version")
    @result_2= @server.call("Bugzilla.timezone")
    @result_3= @server.call("Bug.get",{:ids=>[1]})
    @result_4= @server.call("Bug.add_attachment",{:id=>1})
   
    render :action=>'index'
  end
  
  def new_bug
    @product_name = params[:product_name]
  end
  
  def create_bug
    
    bug = {
        :product     => params[:p], 
        :component   => params[:component],
        :summary     => params[:summary],
        :version     => 'unspecified',
        :description => params[:description],
        :op_sys      => params[:op_sys],
        :platform    => params[:platform],   
        :priority    => params[:priority],
        :severity    => params[:severity]
    }
    
    @server.call("Bug.create",bug)
    
    redirect_to :action=>'index'
  end
  
  def upload
    file = params[:file]
    file_name = file.original_filename
    data = encode64(file.read)
    @server.call("Bug.add_attachment",{:id=>1,:data=>data,:filename=>file_name})
  end
  
private 
 
  def login_bugzilla(name,pass,is_remember)
    
     loginInfo= {
      :login=>name,
      :password => pass,
      :remember => is_remember 
    }
    
    return  @server.call("User.login",loginInfo)
  end
  
  def get_XMLRPC_server
    @server =  XMLRPC::Client.new( "192.168.1.37", "/bugzilla/xmlrpc.cgi")
    login_bugzilla('test1@a.com','111111',false)
  end
  
  def get_products
    ids = @server.call('Product.get_selectable_products')
    p = @server.call('Product.get',ids)
    return p["products"]
  end

end

 3.在Bugzilla的下的/Bugzilla/WebService/Bug.pm文件下加入扩展的API

首先 
use MIME::Base64;

sub add_attachment {
    my ($self,$params) = @_ ;

    my $user = Bugzilla->login(LOGIN_REQUIRED);

    defined $params->{id} || ThrowCodeError('param_required', { param => 'id' }); 
    defined $params->{data} || ThrowCodeError('param_required', { param => 'data' }); 
    defined $params->{filename} || ThrowCodeError('param_required', { param => 'filename' });

    my $bug = Bugzilla::Bug->check($params->{id});

    Bugzilla->user->can_edit_product($bug->product_id) || ThrowUserError("product_edit_denied", {product => $bug->product});

    my $dbh = Bugzilla->dbh;
    my ($timestamp) = $dbh->selectrow_array("SELECT NOW()");

    my $data = decode_base64($params->{data});
    my $filename = $params->{filename};
    my $description = "test from xmlrpc";
    my $contenttype = "image/jpeg";
    my $isurl = 0;
    my $isprivate = 0;

    $dbh->bz_start_transaction();

     my $sth = $dbh->do(
        "INSERT INTO attachments
            (bug_id, creation_ts, modification_time, filename, description,
             mimetype, ispatch, isurl, isprivate, submitter_id)
         VALUES (?,?,?,?,?,?,?,?,?,?)", undef, ($bug->bug_id, $timestamp, $timestamp,
              $filename, $description, $contenttype, 0,
              $isurl, $isprivate, $user->id));
    # Retrieve the ID of the newly created attachment record.
    my $attachid = $dbh->bz_last_key('attachments', 'attach_id');

    # We only use $data here in this INSERT with a placeholder,
    # so it's safe.
    $sth = $dbh->prepare("INSERT INTO attach_data
                         (id, thedata) VALUES ($attachid, ?)");
    trick_taint($data);
    $sth->bind_param(1, $data, $dbh->BLOB_TYPE);
    $sth->execute();
 
    
    $dbh->bz_commit_transaction();
    

    return { at => $data };
}

 

以上就实现了怎么可以给一个现有的bug添加一个attachment了。

 

可能实现的不好,求高人指点更好的解法。

 

 

0
0
分享到:
评论

相关推荐

    Ruby on Rails Tutorial

    在过去的几年中,《Ruby on Rails Tutorial》这本书被视为介绍使用 Rails 进行 Web 开发的先驱者。 在这个全球互联的世界中,计算机编程和 Web 应用程序开发都在迅猛发展,我很期待能为中国的开发者提供 Ruby on ...

    ruby on rails 101

    - **Ruby语言**:深入理解Ruby语言的特性及其在Ruby on Rails中的应用。 - **测试**:介绍如何为Ruby on Rails项目编写单元测试和集成测试。 - **AJAX**:学习如何在Ruby on Rails应用中集成异步JavaScript和XML技术...

    ruby on rails最新版

    Ruby是一种面向对象的动态编程语言,它以其简洁、优雅的语法深受开发者喜爱,而Ruby on Rails则是Ruby在Web开发领域的强大工具。 在压缩包子文件的文件名称列表中仅列出“rails”,这可能是Rails框架的核心库文件,...

    Ruby on Rails安装包全集(Linux)

    在Linux环境下安装Ruby on Rails需要一系列的依赖包和步骤,本资源包提供了所需的所有组件,帮助用户在Linux系统上顺利构建RoR开发环境。 1. **readline-5.1.tar.gz**: 这是Readline库的源代码包,它提供了一种交互...

    ruby on rails社区网站开发源码

    在“ruby on rails社区网站开发源码”中,我们可以学习到如何利用Rails构建一个互动性强、功能丰富的社区网站。以下是一些关键知识点: 1. **安装与环境设置**:首先,你需要安装Ruby和Rails。这通常涉及设置Ruby...

    ruby on rails 3 tutorial.pdf

    《Ruby on Rails 3 Tutorial》是一本专门为初学者设计的指南,旨在帮助读者快速掌握Ruby on Rails这一强大的Web开发框架。Ruby on Rails(简称Rails)是基于Ruby语言的一个开源框架,它采用MVC(Model-View-...

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    ### Ruby on Rails Guides v2 - Ruby on Rails 4.2.5 #### 一、重要概念及基础假设 - **重要概念**:本指南旨在帮助读者深入理解Ruby on Rails(以下简称Rails)4.2.5版本的核心功能与最佳实践。 - **基础假设**:...

    ruby on rails for dummies

    《Ruby on Rails for Dummies》是一本专门为初学者设计的Ruby on Rails教程,它旨在帮助新手快速理解并掌握这个强大的Web开发框架。Ruby on Rails(简称Rails)是基于Ruby编程语言构建的一个开源Web应用程序框架,它...

    Ruby on Rails入门权威经典

    总的来说,《Ruby on Rails入门权威经典》是一本内容丰富、实践性强的教程,它不仅教授了Ruby on Rails的基础知识,还提供了许多实用技巧和最佳实践,是初学者入门Rails的理想选择。通过阅读本书,读者不仅能学会...

    Ruby on Rails实践

    总的来说,Ruby on Rails实践涉及的知识点包括但不限于:Ruby语言基础、Rails框架结构、MVC模式、ActiveRecord、路由、测试驱动开发、插件和gem使用、以及部署策略。通过学习和实践,开发者能够快速构建功能丰富的...

    Ruby on Rails入门经典代码

    Ruby on Rails,简称Rails,是基于Ruby语言的一个开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在使Web开发过程更加高效、简洁。本压缩包中的"Ruby on Rails入门经典代码"提供了新手学习...

    Ruby On Rails中文教材(PDF)

    Ruby on Rails,简称Rails,是一款基于Ruby语言的开源Web应用框架,它遵循MVC(Model-View-Controller)架构模式,旨在简化Web应用程序的开发。Rails由David Heinemeier Hansson于2004年创建,它提倡“约定优于配置...

    Ruby on Rails中文指南

    在Ruby on Rails中文指南中,你将全面学习到如何利用这个强大的框架来构建动态的、数据驱动的Web应用程序。 首先,让我们深入理解Rails的核心概念: 1. **路由(Routes)**:Rails的路由系统是应用程序的导航蓝图...

    ruby on rails 教程源码

    这个“ruby on rails 教程源码”很可能是为了辅助学习者深入理解Rails的工作原理和最佳实践,通过实际操作来提升技能。 在Rails中,`sample_app-master`可能是一个示例应用程序的主目录,它包含了完整的项目结构。...

    提升Ruby on Rails性能的几个解决方案

    Ruby On Rails 框架自它提出之日起就受到广泛关注,在“不要重复自己”,“约定优于配置”等思想的指导下,Rails 带给 Web 开发者的是极高的开发效率。 ActiveRecord 的灵活让你再也不用配置繁琐的 Hibernate 即可...

    Ruby on Rails 4 Tutorial 中文版

    Ruby on Rails 4 Tutorial 是一本深受开发者欢迎的书籍,它详细介绍了如何使用Ruby on Rails这一强大的Web开发框架。Ruby on Rails(简称Rails)是基于Ruby语言的开源框架,以其“约定优于配置”(Convention over ...

    Ruby on Rails教程:学习使用Rails进行Web开发Ruby on Rails Tutorial: Learn Web Development with Rails

    本书教您如何使用Ruby on Rails开发和部署真正的,具有工业实力的Web应用程序,Ruby on Rails是为诸如Twitter,Hulu,GitHub和Yellow Pages等顶级网站提供支持的开源Web框架。

    Ruby On Rails(PDF)

    在众多的开发框架中,Ruby on Rails (RoR) 和 Java 的相关框架尤其受到关注。本文基于给定的PDF文档内容,深入探讨了Ruby on Rails和Java框架之间的区别,尤其是它们在易用性方面的差异。 #### 二、Java框架现状 ...

Global site tag (gtag.js) - Google Analytics