1. 程式人生 > >Android中基於Socket方式的檔案上傳

Android中基於Socket方式的檔案上傳

問題描述:
     需求: 圖片上傳到伺服器中.   在瀏覽器中測試可以通過。 證明伺服器端沒有問題.  但在android端上傳時不行。 
     思考有可能出問題的點:
            1. 因為是檔案上傳時,http協議中檔案長度的計算是否有誤
            2. 因為使用的是socket方式,http請求完全要手工拼接,所以拼接http協議的部分是否有問題. 
            3. android端能否呼叫到伺服器中的  Servlet, 這是一個關鍵點,如果能呼叫到,證明請求沒有問題. 如果呼叫不到,則證明android端的問題. 
     解決思路:
             1. 將androidu端的程式碼最小化,只留下了上傳檔案一個部分,其它的引數去掉.  
             2. 仔細檢查協議的拼接部分,沒有問題. 
             3. 在伺服器中設定了一個斷點,斷點位置在servlet中的dopost方法的第一句話中,經過除錯跟蹤,發現客戶端能聯接上來,但隨著斷點向下執行,注意到  在以下紅色程式碼處,沒有進行addOp方法. 而我的請求地址寫的是:  
http://192.168.1.103/testfileupload/uploadfile.action?op=add,   按道理應該進入   addOp方法執行。  但觀察變數的值發現沒有op這個引數,即這個引數丟失了。   而我們知道,我是在位址列中通過get方式將這個op引數傳過來的,而沒有通過   post實體部分(如果是在實體中,則使用request無法直接獲取). ,應該可以獲取得到。 if (op != null && !"".equals(op)) {

if ("add".equals(op)) {

addOp(request, response);

}

else {

} 
                 通過這個除錯,可以確定問題出在了客戶端, 為什麼會丟失引數呢?
            4. 斷點除錯android客戶端程式碼:
                    a.  呼叫部分OK   
wu.postFileToServer(null, ufs); 
                    b.   傳送請求頭的部分:
                            
OutputStream oos= socket.getOutputStream();

String requestFirstWord="POST "

+url.getPath()+" HTTP/1.1"+BREAKLINE;       // 

oos.write(requestFirstWord.getBytes()); 
                        請注意紅色程式碼部分:   原本我是想獲取到如下的協議:  
POST /testfileupload/uploadfile.action?op=add HTTP/1.1
              但觀察變數得到的卻是:    
POST /testfileupload/uploadfile.action HTTP/1.1
                , 瞬間 。。。。。(此處心情複雜)
               url.getPath()只獲取到了  請求的路徑,但並不會獲取到請求的引數部分。   所以在傳送post請求時,  op=add並沒有傳送. 伺服器端接收不到,所以沒有呼叫addOp()方法. 
          
            問題找到了,解決方案就出來了:
              
OutputStream oos= socket.getOutputStream();

String queryString=url.getQuery();   //取出請求引數.

String requestFirstWord="POST "+url.getPath()+"?"+queryString+" HTTP/1.1"+BREAKLINE;       // POST /res/yyyback/backfood.action?op=add HTTP/1.1 

oos.write(  requestFirstWord.getBytes()    ); 


          解決問題還是須要心靜。 仔細觀察( 看來我還能坐得住).  

相關推薦

Android基於Socket方式檔案

問題描述:      需求: 圖片上傳到伺服器中.   在瀏覽器中測試可以通過。 證明伺服器端沒有問題.  但在android端上傳時不行。       思考有可能出問題的點:          

Android關於FTP的檔案和下載

package ryancheng.example.progressbar; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; impo

Android Studio將本地計算機檔案到模擬器scard檔案

本人在學習Android開發中遇到這樣一個問題,將本地計算機中一個視訊上傳到模擬器的scard檔案中視訊的名字是1.MP4![這裡寫圖片描述](https://img-blog.csdn.net/201

Android基於Socket的網絡通信

ram pre 請求 android 鏈接 ted block param gen Socket鏈接的建立過程: 1.服務器監聽 2.客戶端發出請求 3.建立鏈接 4.通信 Socketl特點: 1.Socket基於TCP鏈接,數據傳輸有保障 2.Socket適用於建立長時

Android核心技術-day05-02-檔案

package com.gaozewen.fileupload; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; impor

基於TCP伺服器檔案與下載

** ## service.c ** #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include &l

springmvcForm表單檔案使用ajax提交

上傳檔案這塊坑真是不少,耽誤了有幾個小時的時間,現在簡單總結一下; 首先springmvc的核心xml中配置下MultipartResolver: <!-- 配置 MultipartResolver -->     <bean id="multipart

springboot基於MultipartFile實現檔案

MultipartFile是springMVC的jar包,不需要其它座標,可以直接使用 一. 新建controller @RequestMapping("/uploadTest1") public String test1(@RequestParam("

Android 打包成aar並到Nexus搭建的maven倉庫

目的 方便元件化流通,搭建私有庫有助於多人協作開發專案,提高整合的穩定性和庫引用版本的可控性,也減少繁瑣的第三方庫的釋出工作。 環境搭建 下載 安裝Nexus–>配置環境,啟動伺服器(請自行百度,本文略) 修改localhost為電腦的ip (

React使用fetch實現檔案下載

在最近的專案中需要實現檔案上傳下載功能,在以前spring、jsp的專案中實現檔案上傳很簡單,但現在前後端分離,前端使用React,後端使用Spring Boot,實現就沒那麼方便了。 前端React使用fetch而非傳統的XMLHttpRequest從後端獲取

Java利用MultipartFile實現檔案

JavaWeb專案頁面實現檔案上傳功能 jsp檔案增加檔案上傳控制元件,可以放在form表單內,增加隱藏域儲存上傳路徑提交到後臺。 <div class="form-group"> <div class="col-sm-7 center "&g

Javaweb最簡單的檔案

3、servlet程式碼 package com.xiaojie.simpleFileupload; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.Input

基於html5的檔案案例

html5的formData物件可以向正常的form表單一樣通過ajax請求傳送,包括上傳檔案並且可以一次性上傳多個檔案。並且可以根據監聽事件,監視上傳進度,終止,結束等等。下面的例項程式碼使用到了bootstrap,跑的話先搭建好bootstrap環境。並且要支援html5的瀏覽器。 jsp頁面程式碼 &l

PHP程式碼是如何實現檔案的?

這裡使用PHP的全域性陣列$_FILES來實現檔案上傳: $_FILES[“file”][“name”] - 被上傳檔案的名稱 $_FILES[“file”][“type”] - 被上傳檔案的型別 $_FILES[“file”][“size”] - 被上傳檔案的大小,以位元組計 $_F

(轉)python 全棧開發,Day75(Django與Ajax,檔案,ajax傳送json資料,基於Ajax的檔案,SweetAlert外掛)

昨日內容回顧 基於物件的跨表查詢 正向查詢:關聯屬性在A表中,所以A物件找關聯B表資料,正向查詢 反向查詢:關聯屬性在A表中,所以B物件找A物件,反向查詢 一對多: 按欄位:xx book --

java FtpClient 實現 FTP 檔案、下載

package ftp; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileWrit

基於AJAX的檔案顯示進度條實現

      基於Ajax的檔案上傳要實現的功能要求,要在使用者提交了上傳按鈕請求後,客戶端其頁面要顯示檔案上傳進度條。       其整個功能時序圖如圖所示。       簡單的說,要實現在客戶端顯示進度條,需要做的是:當客戶端提交上傳檔案請求後,伺服器在上傳檔案

基於WebUploader的檔案外掛

首先把地址甩出來,http://fex-team.github.io/webuploader/ 裡面有比較完整的demo案例文件,本文主要是基於檔案上傳和圖片上傳增加了大量的註釋,基本保證了每行程式碼都有註釋以助於理解,是對官網demo的增強版,希望可以幫助大家更好的理解該

vue實現圖片丶檔案

 html頁面  <input type="file" value=""  id="file"  @change='onUpload'>//注意不能帶括號 js程式碼 methods: {

JAVA NIO SOCKET檔案伺服器

        當前很多手機應用或者是網路應用都需要支援大檔案上傳功能,有些用FTP來實現上傳但是FTP存在許多的問題。比如FTP的安全問題還有不支援GZIP壓縮等問題。採用SOCKET來實現檔案上傳,很輕鬆就可以實現斷點再續和負載均衡,將上傳後的檔案直接儲存到APACHE