C#+Vue实现文件的前后端传输完整版(附完整版代码)

最近笔者也遇到了这样的一个需求,页面上传一张图片给后台,后台存储在一个文件夹中,以便后续在调用该图片。
我也看了很多很多的博客,大都是一半都在说前端的事情 ,一半都在说后端的事情,没有很好的衔接在一起,经过一下午的研究,笔者终于实现了该功能。下面就有笔者慢慢的说吧。

第一步:在Vue中创建一个页面用于图片上传。

<template>
	<div class="Thisform">
      <el-form ref="form" :model="form" label-width="80px">
       	<el-form-item label="咖啡图片:">
          <input type="file" @change="getFile($event)">
        </el-form-item>
        <el-form-item style="padding-left:50px">
          <el-button type="primary" @click="onSubmit">立即添加</el-button>
          <el-button @click="toSelectCoffee">取消</el-button>
        </el-form-item>
      </el-form>
    </div>
</template>

<script>
export default {
  data() {
    return {
      form: {
      },
       file: '',
    };
  },
  methods: {
    onSubmit() {
      let that = this;
      event.preventDefault();//取消默认行为
      //创建 formData 对象
      let param = new FormData();
      param.append("file", this.file);
      this.$axios.post('https://localhost:44373/api/coffee/GetImage', param, {
        headers: {
          "Content-Type": "multipart/form-data"
        }
      })
      .then(response=> {
      	console.log(response);
      })
    },
   
    getFile(event) {
      this.file = event.target.files[0];
      console.log(this.file);
    },
    
<style scoped>
.Thisform {
  width: 30%;
  padding-left: 500px;
  padding-top: 50px;
}
</style>

代码结果:
在这里插入图片描述
至此前端的操作已经基本完成了,前端就很干脆地选择一张图片然后传送到后端。传送的方式是使用axios进行前后端传输,axios给予3个参数,第一个是接口,第二个是数据(这里存放的是一张图片的字节数组),第三个是需要修改的抬头,因为传输的是文件,所以抬头要改为multipart/form-data。

 let param = new FormData();
 param.append("file", this.file);
this.$axios.post('https://localhost:44373/api/coffee/GetImage', param, {
        headers: {
          "Content-Type": "multipart/form-data"
        }
      })

第二步:后台创建一个接口来接收前端传过来的参数。

后台需要做的操作:

  1. 接收图片内容
  2. 通过流写入自己定义的一个文件夹中
  3. 返回这个图片的物理地址

GetImage接口:

[HttpPost]
public string GetImage()
{
   string strWebPath = "false";
   //首先先确定请求里夹带的文件数量
   var files = HttpContext.Current.Request.Files;
   //如果存在文件
   if (files.AllKeys.Any())
   {
       using (HttpClient client = new HttpClient())
       {
           HttpContextBase HttpContext = (HttpContextBase)Request.Properties["MS_HttpContext"];
			//获取到文件流
           var text = HttpContext.Request.Files[0].InputStream;
			//获取你的根目录
           string path = HttpContext.Request.MapPath("~/");
           string datetime = GetTimeStamp();
           //这里要先要建立File文件夹,不然会报错,也可以自己写一个检测文件夹
           string strPath = path + "File\\" + datetime+".jpg";
           //需要用到下一步的帮助类将其保存为文件
           StreamHelp.StreamToFile(text, strPath);
       }
       //return "添加成功";
   }
   return strWebPath;
}

 ///获取时间戳的方法
private string GetTimeStamp()
{
    TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
    return Convert.ToInt64(ts.TotalMilliseconds).ToString();
}

StreamHelp类:

public static class StreamHelp
    {
        /// <summary>
        /// 流转文件
        /// </summary>
        /// <param name="stream"></param>
        /// <param name="fileName"></param>
        public static void StreamToFile(Stream stream, string fileName)
        {
            // 把 Stream 转换成 byte[] 
            byte[] bytes = new byte[stream.Length];
            stream.Read(bytes, 0, bytes.Length);
            // 设置当前流的位置为流的开始 
            stream.Seek(0, SeekOrigin.Begin);
            // 把 byte[] 写入文件 

            FileStream fs = new FileStream(fileName, FileMode.Create);
            BinaryWriter bw = new BinaryWriter(fs);
            bw.Write(bytes);
            bw.Close();
            fs.Close();
        }

        /// <summary>
        /// 文件转流
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public static Stream FileToStream(string fileName)

        {

            // 打开文件 
            FileStream fileStream = new FileStream
            					(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);

            // 读取文件的 byte[] 
            byte[] bytes = new byte[fileStream.Length];
            fileStream.Read(bytes, 0, bytes.Length);
            fileStream.Close();

            // 把 byte[] 转换成 Stream 

            Stream stream = new MemoryStream(bytes);
            return stream;

        }

        /// <summary>
        /// 流转Bytes
        /// </summary>
        /// <param name="stream"></param>
        /// <returns></returns>
        public static byte[] StreamToBytes(Stream stream)

        {

            byte[] bytes = new byte[stream.Length];
            stream.Read(bytes, 0, bytes.Length);

            // 设置当前流的位置为流的开始 

            stream.Seek(0, SeekOrigin.Begin);
            return bytes;

        }

        /// <summary>
        /// Bytes转流
        /// </summary>
        /// <param name="bytes"></param>
        /// <returns></returns>
        public static Stream BytesToStream(byte[] bytes)
        {

            Stream stream = new MemoryStream(bytes);
            return stream;
        }
    }

这样图片的前后端传输就成功了。后续就可以进行其他的像写入数据库等操作。

  • 17
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
实现Java+Vue的家谱前后端分离系统,可以分为以下几个步骤: 1. 设计数据库表结构:可以设计Person表来存储每个人的信息,包括姓名、性别、父亲ID、母亲ID等字段。 2. 创建Java后端API:使用Spring Boot框架创建后端API,提供获取所有人、获取某个人、添加人等接口,通过JPA或MyBatis等框架操作数据库。 3. 创建Vue前端页面:使用Vue框架创建前端页面,包括家谱的展示、添加人、查找人等功能,使用axios等库调用后端API获取数据或提交数据。 以下是Java+Vue实现家谱前后端分离系统的示例代码: Java后端API: ```java @RestController @RequestMapping("/api") public class FamilyTreeController { @Autowired private PersonRepository personRepository; @GetMapping("/people") public List<Person> getAllPeople() { return personRepository.findAll(); } @GetMapping("/person/{id}") public Person getPerson(@PathVariable Long id) { return personRepository.findById(id).orElse(null); } @PostMapping("/person") public Person addPerson(@RequestBody Person person) { return personRepository.save(person); } } ``` Vue前端页面: ```html <template> <div> <h1>家谱</h1> <ul> <li v-for="person in people" :key="person.id"> {{ person.name }} <ul> <li v-for="child in getChildren(person)" :key="child.id"> {{ child.name }} </li> </ul> </li> </ul> <div> <h2>添加人</h2> <form @submit.prevent="addPerson"> <label>姓名:</label> <input type="text" v-model="newPerson.name"> <label>性别:</label> <select v-model="newPerson.gender"> <option value="male">男</option> <option value="female">女</option> </select> <label>父亲:</label> <select v-model="newPerson.fatherId"> <option v-for="person in people" :value="person.id" :key="person.id"> {{ person.name }} </option> </select> <label>母亲:</label> <select v-model="newPerson.motherId"> <option v-for="person in people" :value="person.id" :key="person.id"> {{ person.name }} </option> </select> <button type="submit">添加</button> </form> </div> </div> </template> <script> import axios from 'axios'; export default { data() { return { people: [], newPerson: { name: '', gender: 'male', fatherId: null, motherId: null } } }, created() { this.loadPeople(); }, methods: { loadPeople() { axios.get('/api/people') .then(response => { this.people = response.data; }); }, getChildren(person) { return this.people.filter(p => p.fatherId == person.id || p.motherId == person.id); }, addPerson() { axios.post('/api/person', this.newPerson) .then(response => { this.people.push(response.data); this.newPerson = { name: '', gender: 'male', fatherId: null, motherId: null }; }); } } } </script> ``` 在上面的代码中,`FamilyTreeController`类是Java后端API的实现,提供获取所有人、获取某个人、添加人等接口。`vue`文件Vue前端页面的实现,包括家谱的展示、添加人等功能。通过axios等库调用后端API获取数据或提交数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值