还是上次的需求,让做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了。
可能实现的不好,求高人指点更好的解法。
分享到:
相关推荐
在过去的几年中,《Ruby on Rails Tutorial》这本书被视为介绍使用 Rails 进行 Web 开发的先驱者。 在这个全球互联的世界中,计算机编程和 Web 应用程序开发都在迅猛发展,我很期待能为中国的开发者提供 Ruby on ...
Ruby on Rails Guides v2 - Ruby on Rails 4.2.5
Ruby On Rails中文教材(PDF)
Ubuntu系统ruby on rails安装 Ubuntu系统ruby on rails安装 Ubuntu系统ruby on rails安装 Ubuntu系统ruby on rails安装 Ubuntu系统ruby on rails安装 Ubuntu系统ruby on rails安装 Ubuntu系统ruby on rails安装 ...
ruby on rails社区网站开发源码
ruby on rails对mongodb的操作ruby on rails对mongodb的操作ruby on rails对mongodb的操作ruby on rails对mongodb的操作
在目前的主流web开发技术中,基于ruby语言的rails框架是做网站开发速度最快的工具。它可以达到j2ee框架开发速度的5~10倍,并且代码量也非常少。另外由于代码量的大幅度减少,整个网站维护的工作量也大大降低。 ...
本书的目标是成为对“如果想学习使用 Ruby on Rails 进行 Web 开发,我应该从哪儿开始?”这一问题的最好答案。学习完本书的内容之后,你将具备使用 Rails 进行开发和部署 Web 程序的技能。同时你还能够通过一些进阶...
Ruby On Rails 官方教程,这本书讲解如何使用 Ruby on Rails 框架开发应用,以及如何把应用部署到生成环境。本书使用 Rails 默认的开发工具栈开发了一个完整的社交应用(类似 Twitter)。读完本书后你将掌握如何使用...
Ruby on Rails中文指南
ruby on rails 教程源码,配合原书使用
ruby on rails 开发环境包(ruby1.8.7,rails2.2.3)
ruby on rails最新版 这是本人精心收集的重要软件
该资源包包括在Linux安装Ruby on Rails所需的包,以及安装步骤文档
Ruby On Rails 框架自它提出之日起就受到广泛关注,在“不要重复自己”,“约定优于配置”等思想的指导下,Rails 带给 Web 开发者的是极高的开发效率。 ActiveRecord 的灵活让你再也不用配置繁琐的 Hibernate 即可...
ruby on rails api方便查阅
本书教您如何使用Ruby on Rails开发和部署真正的,具有工业实力的Web应用程序,Ruby on Rails是为诸如Twitter,Hulu,GitHub和Yellow Pages等顶级网站提供支持的开源Web框架。
最新Ruby on Rails中文版介绍,欢迎大家共同学习此最新的技术!随着Ruby和Rails版本的不断升级,这些知识也在不断的更新,谢谢的支持!
基于ruby on rails开发示例源码