HTML区:
<div class="form-group">
<label for="avatar">头像<img class="avatar" width="80px" height="80px"
src="{% static 'image/head/default.png' %}"
alt="图片未加载出"></label>
<input type="file" id="avatar" style="display: none">
</div>
JS代码区
<script>
{#替换头像位置图片方法#}
$('#avatar').change(function () {
{#jquery对象转换为DOM对象#}
var choose_file = $(this)[0].files[0];
{#创建一个阅读器对象#}
var reader = new FileReader();
{#读取choose_file的文件对象#}
reader.readAsDataURL(choose_file);
{#上面代码加载完再运行函数内代码(原因:图片未加载完下面的代码就有可能执行完了)#}
reader.onload = function () {
{# 路径的值在reader.result中#}
$('.avatar').attr("src", reader.result)
}
}
)
</script>
PS:注意务必要引入jQuery样式
#python##Python入门推荐#
最近做勇泰商城项目,用了之前没用过的react和ant-design,其余部分大同小异,结果要在表单里上传图片却犯了难,网上找了一圈也没有找到靠谱的解决方案,遂在这里记录一番
先来一个form组件,然后在form的item里加入upload组件
<Form onFinish={onFinish} form={form}>
<Form.Item
label="商品图片"
name="img"
valuePropName="img"
getValueFromEvent={normFile}
>
<Upload
name="file"
listType="picture-card"
className="avatar-uploader"
action="https://upload.qiniup.com"
showUploadList={false}
data={getToken}
onChange={handleChange}
>
{form.getFieldValue("img") ? (
<img className="img" src={baseURL + form.getFieldValue("img")} alt="" />
) : (
<div>
<div style={{ marginTop: 8 }}>Upload</div>
</div>
)}
</Upload>
</Form.Item>
<Form.Item>
<Space size="middle">
<Button type="primary" htmlType="submit">
提交
</Button>
<Button
onClick={() => {
form.resetFields();
setVisible(false);
}}
>
取消
</Button>
</Space>
</Form.Item>
</Form>
使用form组件的关联属性form,组件渲染时使用form.getFieldValue("img")检测form中是否有相关的值,此时存储的值并不是像往常那样的图片本地地址,而是上传后的图片hash值,若有值,就拼接baserUrl展示图片
<img className="img" src={baseURL + form.getFieldValue("img")} alt="" />
如果没有值的话就显示上传按钮
<div>
<div style={{ marginTop: 8 }}>Upload</div>
</div>
这就需要用到Form.Item的属性getValueFromEvent,官方文档给的描述是“设置如何将 event 的值转换成字段值”,说实话,看了好几遍,没明白,还好找到了一段示例代码,最后勉强明白,应该是会捕捉内部元素触发的回调,内部的upload组件文件状态改变时会有一个回调,参见onChange[1]。Form.Item捕捉到这个回调,我们就可以在里面搞些事情拿到上传后的hash值了,如代码中的getValueFromEvent={normFile}
const normFile = (info) => {
if (info.file.status == "done") {
return info.file.response.key;
}
};
上述代码中增加了一步info.file.status=="done"的判断,因为拿到的事件是文件状态改变的回调,所以只有最后上传完成的一次回调中会带有返回的hash值。
做CURD的都知道,一个表单一般创建和更新共用,刚才解决了创建的问题。其实更新的问题在上文中已经说过了,其实就是使用form.getFieldValue("img"),很简单,问题迎刃而解。
之所以遇到这个问题其实是对新技术的不熟悉,等熟悉了之后也觉得这个问题没什么了。程序开发人员写的文档往往如此,自己心理跟明镜似的,所以文档写得非常简单,但不熟悉的人来看文档的话,就非常吃力了,要铭记此事,常自省也。
[1] onChange: https://ant.design/components/upload-cn/#onChange
JavaScript中,您可以使用HTML5的<input type="file">元素来实现图片上传功能。
以下是一个简单的示例代码,演示如何在JavaScript中上传图片:
HTML部分:
<input type="file" id="uploadInput">
<button onclick="uploadImage()">上传图片</button>
JavaScript部分:
function uploadImage() {
var fileInput = document.getElementById('uploadInput');
var file = fileInput.files[0];
if (file) {
var formData = new FormData();
formData.append('image', file);
// 发送图片数据到服务器
// 这里可以使用XMLHttpRequest或fetch等方法发送请求
// 请根据您的需求选择适当的方法
// 示例中使用XMLHttpRequest发送POST请求
var xhr = new XMLHttpRequest();
xhr.open('POST', '/upload', true);
xhr.onload = function() {
if (xhr.status === 200) {
// 上传成功
console.log('图片上传成功');
} else {
// 上传失败
console.log('图片上传失败');
}
};
xhr.send(formData);
}
}
API部分:
[HttpPost]
[RequestSizeLimit(5242880)]
public async Task<APIResult> upload(IFormCollection collection)
{
APIResult rtn = new APIResult();
if (collection == null)
{
rtn.code = -100;
rtn.msg = "图片列表为空";
return rtn;
}
else
{
try
{
string file_path = "";
// 预处理 用户参数:用户指定子路径
string userPath = DateTime.Now.ToString("yyyy-MM-dd");
if (collection.ContainsKey("path"))
{
collection.TryGetValue("path", out Microsoft.Extensions.Primitives.StringValues val);
if (!val.Equals("undefined"))
{
userPath = val.ToString();
}
}
// 预处理 文件路径
// 注意:这里可能会根据不同的环境来 修改 路径前面是否需要添加 /
// 当发现上传不成功,目录无法创建时,可以尝试修改这里
file_path = $"upload/imgs/{userPath}/";
var uploadPath = Path.Combine(_webHostEnvironment.WebRootPath, file_path);
if (!Directory.Exists(uploadPath))
{
Directory.CreateDirectory(uploadPath);
}
// 处理文件
FormFileCollection filelist = (FormFileCollection)collection.Files;
foreach (IFormFile file in filelist)
{
// 保存文件到磁盘
string name = file.FileName;
string FilePath = Path.Combine(uploadPath, name);
string type = Path.GetExtension(name);
using (var stream = System.IO.File.Create(FilePath))
{
await file.CopyToAsync(stream);
};
// 保存文件信息到表
Sys_File f = new Sys_File();
f.code = "image";
f.name = name;
f.file_type = type.Trim('.');
f.file_group = userPath;
f.file_path = $"/{file_path}{name}";
f.is_active = true;
f.memo = "";
f.createTime = DateTime.Now;
using (var dbctx = DBHelper.db)
{
await dbctx.AddAsync(f);
await dbctx.SaveChangesAsync();
};
// 返回消息,包含文件路径
rtn.datas = $"/{file_path}{name}";
rtn.code = 100;
rtn.msg = "文件已保存!";
}
}
catch (Exception ex)
{
rtn.code = -200;
rtn.msg = "图片保存失败!";
Log4NetUnit.Instance.Log.Error("图片保存失败:" + ex.Message);
}
return rtn;
}
}
在这个示例中,我们首先在HTML中创建了一个<input type="file">元素,用于选择要上传的图片。
然后,我们在JavaScript中编写了一个uploadImage函数,该函数在点击"上传图片"按钮时触发。
在uploadImage函数中,我们首先获取到<input>元素,并从中获取到用户选择的图片文件。
然后,我们创建一个FormData对象,并将图片文件添加到其中。
接下来,我们可以使用XMLHttpRequest或fetch等方法将图片数据发送到服务器。
在示例中,我们使用XMLHttpRequest发送了一个POST请求,将图片数据作为FormData发送到/upload端点。
您需要根据您的实际情况修改URL和请求方法。
当请求完成时,我们可以根据响应的状态码来判断上传是否成功。
在示例中,如果状态码为200,则表示上传成功,否则表示上传失败。
请注意,由于安全性限制,JavaScript无法直接访问用户的文件系统。
因此,用户必须手动选择要上传的文件。
*请认真填写需求信息,我们会在24小时内与您取得联系。