用angularjs进行文件上传

Posted o_osky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用angularjs进行文件上传相关的知识,希望对你有一定的参考价值。

文件上传页面三要素:

1、  form表单提交方式一定是post

2、  form表单的enctype一定是multipart/form-data

3、  form表单中一定要有一个input的type是 file

   文件上传一定要有的jar

       Commons-io和commons-fileupload

 Springmvc文件上传:

1、  springmvc.xml中一定要有 多媒体解析器

  <bean id="multipartResolver"

class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

<property name="defaultEncoding" value="UTF-8"></property>

<!-- 设定文件上传的最大值 5MB,5*1024*1024 -->

<property name="maxUploadSize" value="5242880"></property>

</bean>

2、  后台Controller中的方法中形参使用MultipartFile类型接收文件,参数的名称一定要和页面上的参数名称保持一致

 

自己编写的上传文件demo,上传文件至FastDFS服务器,代码如下:

package demo;

import org.csource.fastdfs.*;

public class FastfsDemo {
    public static void main(String[] args) throws Exception {
        ClientGlobal.init("G:\\\\pyg_parent\\\\pyg_shop_web\\\\src\\\\main\\\\resources\\\\fastdfs_client.conf");
//        2、创建一个 TrackerClient 对象。直接 new 一个
        TrackerClient trackerClient = new TrackerClient();
//        3、使用 TrackerClient 对象获取连接,获得一个 TrackerServer 对象
        TrackerServer trackerServer = trackerClient.getConnection();
//        4、创建一个 StorageServer 的引用,值为 null
        StorageServer storageServer = null;
//        5、创建一个 StorageClient 对象,需要两个参数 TrackerServer 对象、StorageServer 的引用
        StorageClient storageClient = new StorageClient(trackerServer,storageServer);
//        6、使用 StorageClient 对象上传图片
        String[] strings = storageClient.upload_file("C:\\\\Users\\\\o_Osky\\\\Desktop\\\\1.png", "png", null);
//        7、返回数组。包含组名和图片的路径
        for (String string : strings) {
            System.out.println(string);
        }
//  storageClient.delete_file("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf")  删除文件
} }

需要注意的是:上传文件的路径为绝对路径,在实际应用中,应用相对路径,且demo中new 对象过多,所以封装了工具类,代码如下:

package utils;

import org.csource.common.NameValuePair;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient1;
import org.csource.fastdfs.StorageServer;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;

public class FastDFSClient {

    private TrackerClient trackerClient = null;
    private TrackerServer trackerServer = null;
    private StorageServer storageServer = null;
    private StorageClient1 storageClient = null;
    
    public FastDFSClient(String conf) throws Exception {
        if (conf.contains("classpath:")) {
            conf = conf.replace("classpath:", this.getClass().getResource("/").getPath());
        }
        ClientGlobal.init(conf);
        trackerClient = new TrackerClient();
        trackerServer = trackerClient.getConnection();
        storageServer = null;
        storageClient = new StorageClient1(trackerServer, storageServer);
    }
    
    /**
     * 上传文件方法
     * <p>Title: uploadFile</p>
     * <p>Description: </p>
     * @param fileName 文件全路径
     * @param extName 文件扩展名,不包含(.)
     * @param metas 文件扩展信息
     * @return
     * @throws Exception
     */
    public String uploadFile(String fileName, String extName, NameValuePair[] metas) throws Exception {
        String result = storageClient.upload_file1(fileName, extName, metas);
        return result;
    }
    
    public String uploadFile(String fileName) throws Exception {
        return uploadFile(fileName, null, null);
    }
    
    public String uploadFile(String fileName, String extName) throws Exception {
        return uploadFile(fileName, extName, null);
    }
    
    /**
     * 上传文件方法
     * <p>Title: uploadFile</p>
     * <p>Description: </p>
     * @param fileContent 文件的内容,字节数组
     * @param extName 文件扩展名
     * @param metas 文件扩展信息
     * @return
     * @throws Exception
     */
    public String uploadFile(byte[] fileContent, String extName, NameValuePair[] metas) throws Exception {
        
        String result = storageClient.upload_file1(fileContent, extName, metas);
        return result;
    }
    
    public String uploadFile(byte[] fileContent) throws Exception {
        return uploadFile(fileContent, null, null);
    }
    
    public String uploadFile(byte[] fileContent, String extName) throws Exception {
        return uploadFile(fileContent, extName, null);
    }
}

配置spingmvc文件,配置解析器:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <!--引用外部资源文件-->
    <context:property-placeholder location="classpath:config/application.properties"/>
    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes" value="application/json"/>
                <property name="features">
                    <array>
                        <value>WriteMapNullValue</value>
                        <value>WriteDateUseDateFormat</value>
                    </array>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    <!--引用douub服务-->
    <dubbo:application name="pyg-shop-web"/>
    <dubbo:registry address="zookeeper://192.168.25.61:2181"/>
    <dubbo:annotation package="com.pyg.shop"/>
    <mvc:default-servlet-handler/>
    <!--配置多媒体解析器-->
    <bean id="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="UTF-8"></property>
        <!-- 设定文件上传的最大值 5MB,5*1024*1024 -->
        <property name="maxUploadSize" value="5242880"></property>
    </bean>

</beans>

angularjsServer层代码:

app.service("uploadService",function($http){
//    angularJS的文件上传
    this.upload=function(){
//        html5的对象
        var formData = new FormData();
        formData.append("file",file.files[0]); //file.files[0] js的取值方式  取到页面的第一个type=”file“  "file"与MultipartFile file 名字一致
        return $http({
            method:\'post\',
            url:\'../upload/uploadFile\',
            data:formData,
            headers: {\'Content-Type\':undefined},  //写了这一行即声明enctype类型一定是 multipart/form-data  
            transformRequest: angular.identity  //序列化上传的文件
        });
    }
})

angularController层代码:

  $scope.uploadFile = function () {
        uploadService.upload().success(function (result) {
            if (result.flag) {
                $scope.imgUrl = result.message;
            } else {
                alert(result.message);
            }
        })
    }

 

调用工具类实现文件上传:

package com.pyg.shop.controller;

import bean.ResultInfo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import utils.FastDFSClient;


@RestController
@RequestMapping("/upload")
public class UploadController {
    /*
     * springmvc从properties中获取变量的方式
     * application.properties==>upload_server=http://192.168.25.133/
     * */
    @Value("${upload_server}")
    private String uploadServer;

    @RequestMapping("/uploadFile")
    public ResultInfo uploadFile(MultipartFile file) {
        try {
            /*
            * tracker_server=192.168.25.133:22122
            * */
            FastDFSClient fastDFSClient = new FastDFSClient("classpath:fastdfs_client.conf");
            String fileName = file.getOriginalFilename();//获取上传文件的相对路径
            /*
            * 获取上传文件的扩展名
            * png 不带“.” 所以+1
            * */
            String extName = fileName.substring(fileName.lastIndexOf(".") + 1);
            /*
            * 文件上传成功后,返回文件在服务器中位置
            * 为了准确的url需要拼接上服务器ip,ip可能会变动,所以用配置文件加载服务器ip
            * */
            String fileUrl = fastDFSClient.uploadFile(file.getBytes(), extName);
            return new ResultInfo(true, uploadServer + fileUrl);
        } catch (Exception e) {
            e.printStackTrace();
            return new ResultInfo(false, "上传失败");
        }
    }
}

实现效果如下:

 

以上是关于用angularjs进行文件上传的主要内容,如果未能解决你的问题,请参考以下文章

angularJS使用ocLazyLoad实现js延迟加载

分布式文件服务器FastDFS之“文件上传后(JAVA),前(AngularJS)端代码"

angularjs上传文件怎么设置$http为multipart/form-data

AngularJS

如何在 e2e AngularJS 测试中进行文件上传?

AngularJS ——ngResourceRESTful APIs 使用