Vue+Django上传图片

本文介绍如何使用Vue.js实现商品图片上传功能,并通过axios发送图片到后端服务器,利用Python处理图片并保存到数据库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vue

          <el-form ref="form" :model="form" label-width="80px">
            <el-form-item label="商品图片">
              <input type="file" @change="getImageFile" id="img">
              <img :src="image"/>
            </el-form-item>
            <el-form-item>
              <el-button type="primary" @click="onSubmit">确认添加</el-button>
            </el-form-item>
          </el-form>
export const test = (params)=>{
    return axios.post(`tool/test`,params)
}
import {
  test,
  ...
} from "../../api/api";
export default {
  data () {
    return {
      image:'',
        form: {

          goods_image: '',

        },
        ...
     }
  },

...
  methods: {

    getImageFile:function(e) {
      let file = e.target.files[0];
      this.form.goods_image = file;
    },
    onSubmit() {
      let formData = new FormData();
      formData.append('goods_image', this.form.goods_image);
      formData.append('id', this.userData.id);
      var configs = {
        headers:{'Content-Type':'multipart/form-data'}
      }
      test(formData, configs).then(response => {
        if(response.data.msg=="success"){
          this.image = 'http://127.0.0.1:8000/media/'+response.data.image
        }
      })
    },
    ...
}

Python

model.py

    testImage=models.ImageField(verbose_name=u'测试',null=True, blank=True,upload_to = 'avatar/')

view.py

def test(request):
    if request.method == 'POST':
        response = {}
        goods_image = request.FILES.get('goods_image')
        userOne = User.objects.get(id = request.POST.get('id', ''))
        userOne.testImage = goods_image
        userOne.save()
    try:
    	# avatar/705728-20160424234825491-384470376_1CaALm3.png
        response['image'] = str(userOne.testImage)
        response['msg'] = 'success'
        response['error_num'] = 0
    except Exception as e:
        response['msg'] = str(e)
        response['error_num'] = 1

    return JsonResponse(response)

settings.py

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

urls.py

    url(r'^media/avatar/(?P<path>.*)$', serve, {'document_root': os.path.join(settings.MEDIA_ROOT,'avatar/')}),

### 结合 Vue.js Django 部署 PyTorch 模型的解决方案 #### 路由配置与 API 接口设计 在 `urls.py` 文件中,可以通过定义 URL 路由来将请求映射到特定的 API 视图。例如,在 Django 中可以创建一个视图类用于接收来自前端的数据并调用 PyTorch 模型进行预测[^1]。 ```python from django.urls import path from .views import PredictAPIView urlpatterns = [ path('predict/', PredictAPIView.as_view(), name='predict_api'), ] ``` 上述代码片段展示了如何设置一个名为 `predict/` 的路径,该路径会触发 `PredictAPIView` 类中的逻辑处理函数。 #### 创建 Django REST Framework 视图 为了实现前后端分离架构下的交互需求,可以在 Django REST Framework (DRF) 中构建基于类的视图以支持 POST 请求操作: ```python from rest_framework.views import APIView from rest_framework.response import Response import torch from torchvision.transforms import ToTensor from PIL import Image from io import BytesIO import base64 class PredictAPIView(APIView): def post(self, request, *args, **kwargs): image_data = request.data.get('image') if not image_data: return Response({"error": "No image provided"}, status=400) try: # 将 Base64 编码图像转换回二进制流 img_bytes = base64.b64decode(image_data.split(',')[1]) img = Image.open(BytesIO(img_bytes)) transform = ToTensor() tensor_img = transform(img).unsqueeze(0) model = torch.load('./path_to_model.pth') # 加载预训练模型 model.eval() with torch.no_grad(): output = model(tensor_img) _, predicted_class = torch.max(output, 1) result = {"prediction": int(predicted_class)} return Response(result, status=200) except Exception as e: return Response({"error": str(e)}, status=500) ``` 此部分实现了通过 HTTP POST 方法发送图片至后端服务的功能,并利用加载好的 PyTorch 模型完成推理过程。 #### 前端 Vue.js 实现 对于前端而言,则需借助 JavaScript 或者框架如 Vue.js 来发起 AJAX 请求并将用户上传的文件编码成适合传输的形式(比如 Base64)。下面是一个简单的例子展示如何使用 Axios 库向刚才提到的服务端接口提交数据: ```javascript <template> <div id="app"> <h1>Image Prediction</h1> <input type="file" @change="onFileChange"/> <button v-if="selectedFile" @click="upload">Upload and Predict</button> <p>{{ prediction }}</p> </div> </template> <script> import axios from 'axios'; export default { data() { return { selectedFile: null, prediction: '' }; }, methods: { onFileChange(event){ const file = event.target.files[0]; this.selectedFile = file; let reader = new FileReader(); reader.onloadend = () => {this.base64data = reader.result;} reader.readAsDataURL(file); }, upload(){ axios.post('http://localhost:8000/predict/', {'image': this.base64data}) .then(response => { this.prediction = response.data.prediction; }) .catch(error => console.error("There was an error!", error)); } } } </script> ``` 以上脚本允许使用者选择本地图片并通过网络将其传递给远程服务器上的机器学习算法来进行分类识别任务[^2]。 #### 环境部署注意事项 考虑到实际生产环境中可能存在较多复杂的科学计算库依赖关系问题,建议采用 Docker 容器化技术或者直接将整个 Python 虚拟环境迁移到云端实例上来简化运维流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值