angular2通过formdata图片上传

图片上传是我目前在angular2中遇到的最棘手的问题

虽然图片上传的实现就是文件上传,一路辗转试过ng2-file-upload和ng2-image-upload的使用

但是由于项目的开发是前后端分离的,所以最后都死在了跨域问题上(可能我学得不够深不会处理)

在怼了快一个月的绝望之后在另一位大大的代码下下解决了这个问题

这一部分除了图片其他如视频音乐也能通过修改完成上传和预览

html部分:

            <label>上传缩略图</label>
            <div class="file">选择文件
                <input type="file" accept=".jpg,.png" name="image" (change)="selectedFileOnChanged($event)"> 
            </div>
            <div>
                 <img [src]="imageurl" οnerrοr="this.src='http://localhost:80/api/uploaded/loading.jpg'" height="180">

            </div>

ts部分:(只给出主要部分)

 
 
imageurl:string="http://localhost:80/api/uploaded/loading.jpg";//往后端传地址的url
imageUrl ="http://localhost:80/api/uploaded/";//前端ng-src获取页面的url
selectedFileOnChanged(event:any) {
if(event.target.files.length<0) {//判断属性里有无文件
      return
      }
      let files = event.target.files[0];//获取文件的各个参数
      let formData = new FormData();//创建一个formdata的空对象
      formData.append('image',files,files.name);//给这对象加键值,append(name, value, filename);name: 字段名称,value: 字段数值,filename: 文件的文件名(可选).
      this.publish.imgFa(formData).subscribe(//后端通过json传入图片url,并返回url地址
        fb=>{
          const ret1=fb.json();
          this.imageurl=this.imageUrl+ret1.ImageUrl;
          console.log(this.imageurl);
        }
      );
      event.target.value = null;//把目标DOM元素化为空

service部分:(只给出主要部分)

imgFa(formdata){
        return this.http.post(`${SITE_HOST_URL}${UploadAPI}`,formdata);
    }

  后端golang代码:

func UploadHandle(w http.ResponseWriter, r *http.Request) {
	w.Header().Set("Content-Type", "text/html")

	r.ParseForm()
	type URL struct {
		ImageUrl string `json:"ImageUrl"`
	}
	var imageurl URL
	if r.Method != "POST" {
		return
	}

	uploadFile, handle, err := r.FormFile("image")
	if ShowError(err, "图片shangchun失败1") {
		return
	}

	ext := strings.ToLower(path.Ext(handle.Filename))
	if ext != ".jpg" && ext != ".png" {
		return
	}
	absoultepath := GetSrcPath() + "src/api/uploaded/"
	//_dir := "./api/uploaded/"
	os.Mkdir(absoultepath, os.ModePerm)
	timenow := time.Now().UnixNano()
	strnow := strconv.FormatInt(timenow, 10)
	strnow = "img" + strnow + handle.Filename
	saveFile, err := os.OpenFile(absoultepath+strnow, os.O_WRONLY|os.O_CREATE, 0666)
	imageUrl := "http://localhost:80/api/uploaded/" + strnow
	fmt.Printf(imageUrl)
	imageurl.ImageUrl = strnow
	fbData, err := json.Marshal(imageurl)
	fmt.Fprintln(w, string(fbData))
	if ShowError(err, "图片shangchuan失败2") {
		return
	}
	io.Copy(saveFile, uploadFile)

	defer uploadFile.Close()
	defer saveFile.Close()
	fmt.Println("OK")
}

 效果如图: 

上传前

选择完图片后:

查看./api/upload文件夹:

 

转载于:https://www.cnblogs.com/VingB2by/p/8625021.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值