後端開發--之文件上傳

前言:

根據工程與學習的須要,最近接觸了文件上傳的相關知識,一開始由android端使用volley上傳,遇到點問題,最後換成了OKhttp,服務器端採用spring MVC和flask,都成功了,將個人學習歷程記錄下來,爲了更好的分享。java

正文:

1、Spring MVC文件上傳

在Intellij IDEA下開發,確實新的編輯器用起來方便許多,具體的安裝我也是按照網上的教程來搭建環境的,搭建過程比較簡單,如下是我搭建成功的教程:是個系列教程:android

       Intellij搭建web

須要本身下載tomcat,我使用它系統的tomcat報錯了,因此改成本身的tomcat,maven也須要本身配置,系統的也遇到了問題,搭建好後運行第一個web程序,測試完成。spring

下面開始文件上傳的工做,首先須要在maven的pom.xml中引入要文件傳輸的包:數據庫

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.5</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.liferay/org.apache.commons.fileupload -->
    <dependency>
      <groupId>com.liferay</groupId>
      <artifactId>org.apache.commons.fileupload</artifactId>
      <version>1.2.2.LIFERAY-PATCHED-1</version>
    </dependency>

而後修改dispatcher裏的加上支持文件的配置:apache

 <!-- 支持上傳文件 -->  
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>  

個人dispatcher完整代碼以下:json

<?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"
       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">

    <!--指明 controller 所在包,並掃描其中的註解-->
    <context:component-scan base-package="com.controller"/>

    <!-- 靜態資源(js、image等)的訪問 -->
    <mvc:default-servlet-handler/>

    <!-- 開啓註解 -->
    <mvc:annotation-driven/>

    <!--ViewResolver 視圖解析器-->
    <!--用於支持Servlet、JSP視圖解析-->
    <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
</beans>
View Code

而後編寫控制器代碼,使用註解的方式指定url,請求方式,和報頭的格式,具體的代碼以下:flask

/**
 * Created by Y-GH on 2017/4/5.
 */

// 註解標註此類爲springmvc的controller,url映射爲"/home"
@Controller
@RequestMapping("/home")
public class HomeController {
    //添加一個日誌器
    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    //映射一個action
    @RequestMapping(value="/upload",method=RequestMethod.POST,headers = "Accept=application/octet-stream")
    public  String upload(HttpServletRequest request, HttpServletResponse response, @RequestParam("file") MultipartFile file) throws Exception{
        //輸出日誌文件

        System.out.println("upload begin");
        logger.info("the first jsp pages");
        JSONObject object = new JSONObject();
        //返回一個index.jsp這個視圖
        //若是文件不爲空,寫入上傳路徑
        if(!file.isEmpty()) {
            //上傳文件路徑
            System.out.println("開始");
            String path = request.getSession().getServletContext().getRealPath("upload");
//            String path = request.getSession().getServletContext().getRealPath("/images/");
            //上傳文件名
            String filename = file.getOriginalFilename();
            File filepath = new File(path,filename);
            //判斷路徑是否存在,若是不存在就建立一個
            if (!filepath.getParentFile().exists()) {
                filepath.getParentFile().mkdirs();
            }
            //將上傳文件保存到一個目標文件當中
            file.transferTo(new File(path + File.separator + filename));

            object.put("results", "success");
            return "success";
        } else {
            object.put("results", "error");
            return "error";
        }
       
    }
}

使用MultipartFile上傳文件,很輕鬆就實現了,android端的代碼最後貼。spring-mvc

2、使用flask上傳文件

flask上傳文件只須要幾行代碼,更加方便,代碼以下:tomcat

import json
from flask import Flask
from flask import request
from flask import redirect
from flask import jsonify
app = Flask(__name__)

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        f = request.files['file']
        f.save('/home/ygh/flask/img_card.jpg')
        data = '{"result":"sucess"}'
        result = json.loads(data)
        return json.dumps(result)
    else:
        return "error"

if __name__ == '__main__':
    app.run(host='0.0.0.0')

指定url後,判斷是不是post請求,是post請求只須要將request的文件取出便可,而後使用save保存到指定的目錄下,而後向客戶端返回json格式的結果。

這裏的文件請求都沒有使用數據庫,使用數據庫只須要將文件名和路徑存入數據表中,下次取地址後,直接遍歷取出文件便可。

 

-------------------------------------------------------------------------------------------------

接下來我把android客戶端的OKhttp下的請求代碼也貼出來,方便參考:

首先引入Okhttp的依賴:

compile 'com.squareup.okhttp:okhttp:2.4.0'
compile 'com.squareup.okio:okio:1.5.0'

而後在java中實現便可,尚未來得及進行封裝,用的原生的方式:

//首先在主線程的onCreate或onActivityResult開啓線程:
  new Thread(this).start();

//而後重寫系統回掉方法,
//注意 MainActivity extends AppCompatActivity implements Runnable
@Override
    public void run() {
        try {
            PostFile(imgPath);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

  //上傳方法  集成了okhttp
    private void PostFile(String imgPath) throws IOException, JSONException {
        File file = new File(imgPath);
        if (!file.exists())
        {
            Toast.makeText(MainActivity.this, "文件不存在,請修改文件路徑", Toast.LENGTH_SHORT).show();
            return;
        }
  //開始找到路徑放入請求體內
        RequestBody body = new MultipartBuilder()
                .addFormDataPart("file",imgPath , RequestBody.create(MediaType.parse("media/type"), new File(imgPath)))
                .type(MultipartBuilder.FORM)
                .build();
   //創建請求
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();

        OkHttpClient client = new OkHttpClient();
        Response response = client.newCall(request).execute();//發送請求
        String tempResponse =  response.body().string();
        Log.e("==返回結果==","---"+tempResponse);
        JSONArray arr = new JSONArray(tempResponse);
        String responsew = arr.getString(0);
        JSONObject obj = new JSONObject(responsew);
        result = obj.getString("result");
        Log.e("==輸出==","--"+result);
        if(result.equals("sucess")){
            JSONObject obj2 = new JSONObject(obj.getString("response"));
            Log.e("==response==","------"+obj.getString("response"));
            String day = obj2.getString("day");
            Log.e("---day---","==>"+day);
            mHandler.sendEmptyMessage(0);
        }else if(result.equals("error")){
            Log.e("==返回==","---出錯---");
            mHandler.sendEmptyMessage(1);
        }

    }

   //根據返回結果執行mHandler相應傳入處理消息的方式
    private Handler mHandler = new Handler() {
        public void handleMessage(android.os.Message msg) {

            switch (msg.what) {
                case 0:
                    dialog.cancel();
                    Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
                    break;
                case 1:
                    dialog.cancel();
                    Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
                    break;
            }
        };
    };

至此,完成了文件上傳的基本功能,後續有新的方法會及時補充。

                                            by  STILL

相關文章
相關標籤/搜索