- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 elixir/phoenix 后端中有两个 product
Controller 。第一个 - API 端点 (pipe_through :api
) 和第二个 Controller 通过 :browser 进行管道传输
:
# router.ex
scope "/api", SecretApp.Api, as: :api do
pipe_through :api
resources "products", ProductController, only: [:create, :index]
end
scope "/", SecretApp do
pipe_through :browser # Use the default browser stack
resources "products", ProductController, only: [:new, :create, :index]
end
ProductController
处理来自 elixir 表单助手生成的表单的请求并接受一些文件附件。一切都很好。这是创建操作和该操作处理的参数:
def create(conn, %{"product" => product_params}) do
changeset = Product.changeset(%Product{}, product_params)
case Repo.insert(changeset) do
{:ok, _product} ->
conn
|> put_flash(:info, "Product created successfully.")
|> redirect(to: product_path(conn, :index))
{:error, changeset} ->
render(conn, "new.html", changeset: changeset)
end
end
来自日志的参数(我正在使用 arc 来处理 Elixir 代码中的图像上传)
[debug] Processing by SecretApp.ProductController.create/2
Parameters: %{"_csrf_token" => "Zl81JgdhIQ8GG2c+ei0WCQ9hTjI+AAAA0fwto+HMdQ7S7OCsLQ9Trg==", "_utf8" => "✓",
"product" => %{"description" => "description_name",
"image" => %Plug.Upload{content_type: "image/png",
filename: "wallpaper-466648.png",
path: "/tmp/plug-1460/multipart-754282-298907-1"},
"name" => "product_name", "price" => "100"}}
Pipelines: [:browser]
Api.ProductController
处理来自 redux-from 的请求。这是由该操作处理的操作、 View 和参数:
# action in controller
def create(conn, %{"product" => product_params}) do
changeset = Product.changeset(%Product{}, product_params)
case Repo.insert(changeset) do
{:ok, _product} ->
conn
|> render("index.json", status: :ok)
{:error, changeset} ->
conn
|> put_status(:unprocessable_entity)
|> render("error.json", changeset: changeset)
end
end
# product_view.ex
def render("index.json", resp=%{status: status}) do
%{status: status}
end
def render("error.json", %{changeset: changeset}) do
errors = Enum.into(changeset.errors, %{})
%{
errors: errors
}
end
[info] POST /api/products/
[debug] Processing by SecretApp.Api.ProductController.create/2
Parameters: %{"product" => %{"description" => "product_description", "image" => "wallpaper-466648.png", "name" => "product_name", "price" => "100"}}
Pipelines: [:api]
[info] Sent 422 in 167ms
创建操作失败,状态为 422,因为无法使用这些参数保存图像。我的问题是我无法从后端代码访问图像,我只在 JS 代码中将其作为 FileList 对象。我不明白如何将图像传递给后端代码。以下是此附件在我的 JS 代码中的表示方式(FileList,包含有关上传图像的信息)。
value:FileList
0: File
lastModified: 1381593256801
lastModifiedDate: Sat Oct 12 2013 18:54:16 GMT+0300
name: "wallpaper-466648.png"
size: 1787293
type: "image/png"
webkitRelativePath: ""
我只有 WebkitRelativePath (如果使用第一个 Controller ,我有图像路径:“/tmp/plug-1460/multipart-754282-298907-1”),我不知道我可以用这个 JS 对象做什么以及如何访问这个JS对象所代表的真实图像(这里有一个关于文件上传的redux-form reference)。
你能帮我吗?如何向 Elixir 解释如何查找图像?我只是想使用 JS 代码将文件附件提交到我的后端(因为有很多有趣的异步验证功能等)。
这里是完整的 app 的链接如果有帮助的话
最佳答案
终于我成功解决了这个问题。解决方案是正确序列化 redux-form已提交参数。
这是我的 redux 表单,请求的起点:
// product_form.js
import React, { PropTypes } from 'react';
import {reduxForm} from 'redux-form';
class ProductForm extends React.Component {
static propTypes = {
fields: PropTypes.object.isRequired,
handleSubmit: PropTypes.func.isRequired,
error: PropTypes.string,
resetForm: PropTypes.func.isRequired,
submitting: PropTypes.bool.isRequired
};
render() {
const {fields: {name, description, price, image}, handleSubmit, resetForm, submitting, error} = this.props;
return (
<div className="product_form">
<div className="inner">
<form onSubmit={handleSubmit} encType="multipart/form-data">
<div className="form-group">
<label className="control-label"> Name </label>
<input type="text" className="form-control" {...name} />
{name.touched && name.error && <div className="col-xs-3 help-block">{name.error}</div>}
</div>
<div className="form-group">
<label className="control-label"> Description </label>
<input type="textarea" className="form-control" {...description} />
{description.touched && description.error && <div className="col-xs-3 help-block">{description.error}</div>}
</div>
<div className="form-group">
<label className="control-label"> Price </label>
<input type="number" step="any" className="form-control" {...price} />
{price.touched && price.error && <div className="col-xs-3 help-block">{price.error}</div>}
</div>
<div className="form-group">
<label className="control-label"> Image </label>
<input type="file" className="form-control" {...image} value={ null } />
{image.touched && image.error && <div className="col-xs-3 help-block">{image.error}</div>}
</div>
<div className="form-group">
<button type="submit" className="btn btn-primary" >Submit</button>
</div>
</form>
</div>
</div>
);
}
}
ProductForm = reduxForm({
form: 'new_product_form',
fields: ['name', 'description', 'price', 'image']
})(ProductForm);
export default ProductForm;
当用户按下“提交”按钮后,此表单将以下参数传递给函数handleSubmit
# values variable
Object {name: "1", description: "2", price: "3", image: FileList}
# where image value is
value:FileList
0: File
lastModified: 1381593256801
lastModifiedDate: Sat Oct 12 2013 18:54:16 GMT+0300
name: "wallpaper-466648.png"
size: 1787293
type: "image/png"
webkitRelativePath: ""
为了将这些参数传递到后端,我使用 FormData Web API和 file-upload request using isomorphic-fetch npm module
下面的代码实现了这一点:
// product_form_container.js (where form submit processed, see _handleSubmit function)
import React from 'react';
import ProductForm from '../components/product_form';
import { Link } from 'react-router';
import { connect } from 'react-redux';
import Actions from '../actions/products';
import * as form_actions from 'redux-form';
import {httpGet, httpPost, httpPostForm} from '../utils';
class ProductFormContainer extends React.Component {
_handleSubmit(values) {
return new Promise((resolve, reject) => {
let form_data = new FormData();
Object.keys(values).forEach((key) => {
if (values[key] instanceof FileList) {
form_data.append(`product[${key}]`, values[key][0], values[key][0].name);
} else {
form_data.append(`product[${key}]`, values[key]);
}
});
httpPostForm(`/api/products/`, form_data)
.then((response) => {
resolve();
})
.catch((error) => {
error.response.json()
.then((json) => {
let responce = {};
Object.keys(json.errors).map((key) => {
Object.assign(responce, {[key] : json.errors[key]});
});
if (json.errors) {
reject({...responce, _error: 'Login failed!'});
} else {
reject({_error: 'Something went wrong!'});
};
});
});
});
}
render() {
const { products } = this.props;
return (
<div>
<h2> New product </h2>
<ProductForm title="Add product" onSubmit={::this._handleSubmit} />
<Link to='/admin/products'> Back </Link>
</div>
);
}
}
export default connect()(ProductFormContainer);
其中 httpPostForm
是 fetch 的包装器:
export function httpPostForm(url, data) {
return fetch(url, {
method: 'post',
headers: {
'Accept': 'application/json'
},
body: data,
})
.then(checkStatus)
.then(parseJSON);
}
就是这样。我的 Elixir 代码中没有任何需要修复的内容,Api.ProductController
保持不变(请参阅最初的帖子)。但现在它收到带有以下参数的请求:
[info] POST /api/products/
[debug] Processing by SecretApp.Api.ProductController.create/2
Parameters: %{"product" => %{
"description" => "2",
"image" => %Plug.Upload{
content_type: "image/jpeg",
filename: "monkey_in_jungle-t3.jpg",
path: "/tmp/plug-1461/multipart-853391-603088-1"
},
"name" => "1",
"price" => "3"}}
Pipelines: [:api]
非常感谢每个试图帮助我的人。希望这可以帮助那些遇到类似序列化问题的人。
关于redux-form 和 Elixir/phoenix 作为后端 API 的文件附件(序列化问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36654641/
我是 python 的新手。我试图找到我的文本的频率分布。这是代码, import nltk nltk.download() import os os.getcwd() text_file=open(
我对安卓 fragment 感到困惑。我知道内存 fragment 但无法理解什么是 android fragment 问题。虽然我发现很多定义,比如 Android fragmentation re
尝试对 WordPress 进行 dockerise 我发现了这个场景: 2个数据卷容器,一个用于数据库(bbdd),另一个用于wordpress文件(wordpress): sudo docker
这个问题已经有答案了: From the server is there a way to know that my page is being loaded in an Iframe (1 个回答)
我正在玩小型服务器,试图对运行在其上的服务进行docker化。为简化起见,假设我必须主要处理:Wordpress和另一项服务。 在Docker集线器上有许多用于Wordpress的图像,但是它们似乎都
我想要发生的是,当帐户成功创建后,提交的表单应该消失,并且应该出现一条消息(取决于注册的状态)。 如果成功,他们应该会看到一个简单的“谢谢。请检查您的电子邮件。” 如果不是,那么他们应该会看到一条适当
就是这样,我需要为客户添加一个唯一标识符。通过 strip 元数据。这就是我现在完全构建它的方式,但是我只有最后一部分告诉我用户购买了哪个包。 我试着看这里: Plans to stripe 代码在这
我有一个类将执行一些复杂的操作,涉及像这样的一些计算: public class ComplexAction { public void someAction(String parameter
这个问题已经有答案了: maven add a local classes directory to module's classpath (1 个回答) 已关闭10 年前。 我有一些不应更改的旧 E
我使用 fragment 已经有一段时间了,但我经常遇到一个让我烦恼的问题。 fragment 有时会相互吸引。现在,我设法为此隔离了一个用例,它是这样的: Add fragment A(也使用 ad
我的 html 中有一个 ol 列表,上面有行条纹。看起来行条纹是从数字后面开始的。有没有办法让行条纹从数字开始? 我已经包含了正在发生的事情的片段 h4:nth-child(even) {
如何仅使用 css 将附加图像 html 化? 如果用纯 css 做不到,那我怎么能至少用一个图像来做 最佳答案 这不是真正的问题,而是您希望我们为您编写代码。我建议您搜索“css breadcrum
以下是 Joshua 的 Effective Java 的摘录: If you do synchronize your class internally, you can use various te
在这里工作时,我们有一个框向业务合作伙伴提供 XML 提要。对我们的提要的请求是通过指定查询字符串参数和值来定制的。其中一些参数是必需的,但很多不是。 例如,我们要求所有请求都指定一个 GUID 来标
我有 3 个缓冲区,其中包含在 32 位处理器上运行的 R、G、B 位数据。 我需要按以下方式组合三个字节: R[0] = 0b r1r2r3r4r5r6r7r8 G[0] = 0b g1g2g3g4
我最近发现了关于如何使用 History.js、jQuery 和 ScrollTo 通过 HTML5 History API 对网站进行 Ajax 化的要点:https://github.com/br
我们有一个 Spring Boot 应用程序,由于集成需要,它变得越来越复杂——比如在你这样做之后发送一封电子邮件,或者在你之后广播一条 jms 消息等等。在寻找一些更高级别的抽象时,我遇到了 apa
我正在尝试首次实施Google Pay。我面临如何指定gateway和gatewayMarchantId的挑战。 我所拥有的是google console帐户,不知道在哪里可以找到此信息。 priva
昨天下午 3 点左右,我为两个想要从一个 Azure 帐户转移到另一个帐户的网站设置了 awverify 记录。到当天结束时,Azure 仍然不允许我添加域,所以我赌了一把,将域和 www 子域重新指
我正在使用terms facet在elasticsearch服务器中获取顶级terms。现在,我的标签"indian-government"不被视为一个标签。将其视为"indian" "governm
我是一名优秀的程序员,十分优秀!