我正在使用TypeScript和Haml。我希望能够使用vue.js上传和查看文件。我可以上传图片,但它应该立即显示,如下所示:https://codepen.io/Atinux/pen/qOvawK/
相反,我收到了这个错误:
http://localhost:8080/image无法加载资源:服务器响应状态为404(未找到)
如果它试图从根目录中获取图像,那么我的问题是我没有将其保存在那里吗?我该如何解决这个问题?
page_image.ts:
require("./page_image.scss");
import Vue = require("vue");
import {Injections} from "../../init";
export const PageImage = {
template: require("./page_image.haml"),
data: function () {
return {
image: ''
}
},
created() {
Injections.HeaderTextManager.setHeader("Videos");
Injections.HeaderTextManager.clearDescription();
},
methods: {
onFileChange(e:any) {
var files = e.target.files || e.dataTransfer.files;
if (!files.length)
return;
this.createImage(files[0]);
},
createImage(file:any) {
var image = new Image();
var reader = new FileReader();
var vm = this;
reader.onload = (e:any) => {
vm.image = e.target.result;
};
reader.readAsDataURL(file);
},
removeImage: function (e:any) {
this.image = '';
}
}
};
page_image.haml:
.page-image
.row
.col-xs-12
.box
.box-header
%div(v-if="!image")
%h3.box-title Upload an image
%input(type="file" v-on:change="onFileChange")
%div(v-else)
%img(src="image" name="image")
%img {{image}}
%button(v-on:click="removeImage") Remove image
答案 0 :(得分:0)
我不知道haml
,我不使用带vue.js
的打字稿。所以我不能直接回答你。
这是一个有效的jsFiddle示例,它使用FileReader
实现vue.js
以提供即时预览:
https://jsfiddle.net/mani04/5zyozvx8/
您可以使用上面的参考来调试您的代码。
以下是它的工作原理:为了使FileReader正常工作,我们需要访问input
的DOM元素。这可以通过以下方式完成:
<input type="file" @change="previewImage" accept="image/*">
previewImage
方法获取event
参数,该参数包含event.target
- 我们需要的input
的DOM元素。现在,您的previewImage
方法可以正常读取图像文件,如下所示:
previewImage: function(event) {
// Reference to the DOM input element
var input = event.target;
// Ensure that you have a file before attempting to read it
if (input.files && input.files[0]) {
// create a new FileReader to read this image and convert to base64 format
var reader = new FileReader();
// and so on...
您可以使用此jsFiddle作为参考,并保持此问题的开放性,以便了解haml
和typescript
的其他人可以提供更直接的答案。
答案 1 :(得分:0)
我认为问题是由于page_image.haml
中的这一行引起的%img(src="image" name="image")
如果它翻译或编译为<image src="image" name="image">
,则您的浏览器会在localhost:8080/image
中查找图片,而不是尝试在Vue组件内显示data.image
。
正如我在其他答案中所解释的那样,我不知道haml
,所以你必须想办法自己解决这个问题。
修改强>
查看问题中的其他haml
代码,这有用吗?
%img(v-bind:src="image" name="image")