gpt4 book ai didi

ios - Rails 4.2 - 将图像数据作为电子邮件附件发送而不保存图像

转载 作者:行者123 更新时间:2023-12-01 18:54:38 24 4
gpt4 key购买 nike

我的客户端应用程序是一个用 Swift 编写的 iOS 应用程序。在那个 iOS 应用程序中,我将图像转换为 Base64 编码的字符串,然后将该字符串作为 HTTP 请求的正文发送到我的 Rails 服务器。这是我这样做的代码:

// Create a new URL request with the URL
let request: NSMutableURLRequest = NSMutableURLRequest(URL: url)

// Set the HTTP method to POST
request.HTTPMethod = "POST"

// Set the content type of the request to XML
request.setValue("application/xml", forHTTPHeaderField: "Content-Type")

// Convert the image to binary and then to a Base 64 Encoded String
let imageData:String = UIImagePNGRepresentation(image).base64EncodedStringWithOptions(nil)

// Set the HTTP Body of the request to the image
request.HTTPBody = NSData(base64EncodedString: imageData, options: nil)

在我处理请求的 Rails Controller 中,我想检索图像并将其作为电子邮件附件发送。我不想将图像保存在任何地方;我只想解码内存中的图像,然后以某种方式将其用作电子邮件附件。

如何在我的 Rails Controller 中检索图像数据并以允许我将其作为电子邮件附件发送回的方式对其进行解码?

为了检索图像数据,我尝试使用 request.body.read ,但由于某种原因,这会返回一个空字符串。

提前感谢您的帮助!

编辑:
request.body.read因为我使用了 GET 请求,所以返回了一个空字符串。从那以后我了解到在 GET 请求中发送 HTTP 正文不是一个好主意,所以我将方法更改为 POST。现在 request.body.read正在返回我的编码字符串!我还在请求中添加了 Content-Type header 。

尽管如此,我还是不知道如何正确解码 HTTP 正文并将其分配给某种图像对象。

编辑#2:

我已经设法使用以下代码在我的邮件中发送电子邮件附件:
attachments["file.png"] =
{
mime_type: 'image/png',
content: Base64.decode64(request.body.read)
}

不幸的是,当我在电子邮件中收到 PNG 文件时,无法打开它。我不知道编码是否能很好地从 Swift 转换为 Ruby。我会继续调查。

编辑#3:

我删除了 Base64 字符串编码,效果很好!请参阅下面我发布的答案。

最佳答案

我想到了!我认为 Base64 编码/解码在 Swift 和 Ruby 上的执行方式不同,所以我决定将图像作为 NSData 发送而不使用字符串编码,然后将其发送回去,这样就成功了!这是我的最终代码:

swift

// Create a URL
let url:NSURL = NSURL(string: urlString)!

// Create a new URL request with the URL
let request: NSMutableURLRequest = NSMutableURLRequest(URL: url)

// Set the HTTP method to POST
// GET requests usually do not have an HTTP Body, and it's considered a very bad idea to include one in a GET request
request.HTTPMethod = "POST"

// Set the content type of the request to XML
request.setValue("application/xml", forHTTPHeaderField: "Content-Type")

// Convert the image to binary data
let imageData:NSData = UIImagePNGRepresentation(image)

// Set the HTTP Body of the request to the image
request.HTTPBody = imageData

// Create a new queue
let queue:NSOperationQueue = NSOperationQueue()

// Send the async request
NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:
{ (response:NSURLResponse!, data:NSData!, error:NSError!) -> Void in
println(response)
})

您可以将此代码放在任何方法中。

Ruby on Rails(Ruby 2.1.1 和 Rails 4.2.0)
class ImageApiController < ApplicationController
# Skip verifying the authenticity token since a form wasn't submitted; a web request was sent
skip_before_filter :verify_authenticity_token, :only => [ :index ]

def index
params[:image] = request.body.read

# Send the email
UserMailer.image_attachment_email(params).deliver_now

respond_to do |format|
format.html
format.js { render plain: "Test" }
format.xml { render plain: "Test" }
end
end
end

然后在 UserMailer 中:
class UserMailer < ApplicationMailer
def image_attachment_email(params)
attachments["image.png"] =
{
mime_type: 'image/png',
content: params[:image]
}

# Send an email
mail(to: "user@example.com", subject: "Image")
end
end

所以实际上不需要 Base64 字符串编码。这段代码很好用!

关于ios - Rails 4.2 - 将图像数据作为电子邮件附件发送而不保存图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28508158/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com