1. 程式人生 > >伺服器開發之Unity3d(C#)圖片上傳下載

伺服器開發之Unity3d(C#)圖片上傳下載

一、前言

遊戲中圖片的上傳下載是一個亙古不變的話題,這次在開發遊戲伺服器的過程中也不可避免的出現了圖片下載和上傳的問題。遇到了PNG圖片下載完成後透明的部分變成黑色、圖片上傳附帶驗證資訊、下載後文件不一樣的問題。

二、問題回顧

伺服器上面儲存了一張完整的png圖片,圖片中有大片的透明部分。在圖片下載到本地後出現透明部分變成了黑色。我是用的是下面的方法:

String url = "http://IP:port/XXX.png";
WWW www = new WWW(url);
Texture2D image = www.texture;
byte[] imageByte = image.EncodeToPNG();
String
outSavePaht = "本地路徑\XXX.png"; File.WriteAllBytes(outSavePaht, imageByte);

用這個方法下載下來的PNG圖片會出現透明部分黑掉。下載後會出現與上傳的圖片大小不一致的問題,這個問題後來使用了檔案校驗的方式來解決了。
圖片上傳的時候除了要傳送校驗方式還需要一併傳送相關的資料。最初的想法是要把相關的資訊在圖片中儲存(沒有分開),後面的解決方法是將圖片和資料再一次傳送中分開,做成一個數據封包。這樣做的效果顯著,順利的解決了我的問題。

三、一個可行的解決方案

1、圖片上傳(服務端接收)

這邊給一個測試用的表單,如下:

$this->show('<form action="__URL__/upload" enctype="multipart/form-data" method="post" >
<input type="file" name="img" />
<input type="submit" value="提交" >
</form>');

其中upload方法如下:

    public function upload(){
        $upload = new \Think\Upload();// 例項化上傳類
        $upload
->maxSize = 3145728 ;// 設定附件上傳大小 $upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 設定附件上傳型別 $upload->rootPath = './'; // 設定附件上傳根目錄 $upload->savePath = 'Uploads/'; // 設定附件上傳(子)目錄 // 上傳檔案 $info = $upload->upload(); if(!$info) {// 上傳錯誤提示錯誤資訊 $this->error($upload->getError()); }else{// 上傳成功 $this->success('上傳成功!'); } }

上傳成功後會將圖片儲存在根目錄下的Uploads資料夾下。客戶端的圖片上傳方法在第3點集中給出。

2、圖片下載

圖片下載後會在Unity3d中使用,這裡用C#程式碼來下載。

WebClient wc = new WebClient();
wc.Headers.Add("User-Agent", "Chrome");
wc.DownloadFile(tempUrl, outSavePaht);//tempUrl是圖片地址,outSavePath是圖片儲存的絕對的路徑

通過WebClient申明的物件wc來下載一張URL類似於http://IP:port/xxx.png儲存到本地類似於C:\xxx.png的路徑裡面。通過這個方法就可將網路圖片下載到本地,如果需要在linux環境下下載只需要修改儲存路徑就好。

3、上傳圖片時附帶其他資訊(包含圖片校驗資訊)

客戶端傳送一張圖片到伺服器,這張圖片我們想讓他與我們的使用者資訊進行有效關聯。這就會產生在傳送圖片的時候附帶傳送一些額外的資訊。Unity3d中提供了一個很好的表單方法,對這個表單進行合理使用是可以達到傳送圖片的同時附帶我們自定義的資訊的。下面演示一下:

FileStream fs = File.OpenRead(imagePath);
int len = (int)fs.Length;
byte[] b = new byte[len];
fs.Read(b, 0, len);
WWWForm form = new WWWForm();
form.AddField("info", infostr);
form.AddBinaryData("img", b, fileName.Trim(), "multipart/form-data");
WWW www = new WWW(url, form);

最後根據伺服器的返回值來判斷圖片的上傳情況,其中info欄位就是我們的自定義欄位,我現在的info是指的圖片校驗資訊。通過校驗資訊服務端就可以校驗圖片的真確性。

4、下載的圖片和上傳到伺服器的圖片大小不一致

這個問題的解決使用的是在第3點上傳附加資訊中的圖片校驗欄位資訊,我們可以在下載的時候將之前上傳的校驗資訊再讀取出來,對圖片進行二次校驗。如果校驗失敗可以再次下載。
這樣可以避免圖片下載出錯的問題。其實我跟換下載方式後就沒有出現過這種問題了。這裡只是列出來,使用最初的下載方式會帶來的影響。

四、結束語

如果對文章有疑問可以通過郵箱[email protected]與我一起探討。
也可以加入QQ群137163838,開源我們的思維,點亮整個世界!

相關推薦

伺服器開發Unity3dC#圖片下載

一、前言 遊戲中圖片的上傳下載是一個亙古不變的話題,這次在開發遊戲伺服器的過程中也不可避免的出現了圖片下載和上傳的問題。遇到了PNG圖片下載完成後透明的部分變成黑色、圖片上傳附帶驗證資訊、下載後文件不一樣的問題。 二、問題回顧 伺服器上面儲存了

伺服器開發Unity3dC#介面回撥

一、前言 一隻腳踏入伺服器開發的行列,一隻腳還在客戶端徘徊。在這個職業規劃亦或是人生規劃的三叉路口,未來是朝著客戶端發展,還是向服務端進發。現在是一個重要的選擇,也是一個全新的機會。這篇文章我把它分類到伺服器開發之列,也想把這篇文章列入我今後伺服器開發的第

Java伺服器部署基於OpenCV的C++影象處理專案圖片並返回處理圖

Java伺服器部署基於OpenCV的C++影象處理專案(三)圖片上傳並返回處理圖 1.上傳圖片並返回灰度圖功能 由於使用的springboot開發,直接寫一個upload介面供圖片上傳,以下是springboot主函式以及upload介面。 package com.e

使用ASP.netC#批量圖片並自動生成縮圖,文字水印圖,圖片水印圖

因本網站上傳圖片的需要,參考很多成熟的經驗,在ASP.net平臺上使用C#語言,做了這一自動批量上傳圖片的.ASPX檔案,並經除錯成功,在本網站上使用,現發出來供大家參考,也希望高手多加指點。 本程式主要功能有: (1)可以根據自己的需要更改上傳到伺服器上的目錄,上傳

微信小程式開發圖片+服務端接收

上次介紹了小程式開發中的微信登入。文章: 微信小程式開發(一) 微信登入流程, 這次介紹下小程式當中常用的圖片上傳。 前幾天做了圖片上傳功能,被坑了一下。接下來我們來看一下微信的上傳api。 這裡的filePath就是圖片的儲存路徑,型別居然是個

PHP+jQuery+Ajax單圖片

近日寫的一個銷售管理系統中,需要使用者上傳產品的圖片,找了好多外掛,用起來都挺麻煩的而且還不好改,最後找到一篇用php和ajax做圖片上傳的,感覺程式碼挺簡單的而且改起來很容易,轉發到此處與各位分享一下: 我們在本文中用到一個Ajax表單提交外掛:jqery.

檔案圖片,Spring或SpringMVC框架

spring或springMVC框架圖片(檔案)上傳 頁面部分,用一個簡單的form表單提交檔案,將圖片或檔案提交到服務端。一個輸入框,用於輸入圖片的最終名稱,一個file檔案選擇,用於選擇圖片。 頁面程式碼如下: <form id="form1" &g

在jsp頁面中新增富文字編譯器ueditor+ 圖片功能

  一次老大讓我把文字的編輯區域加一個富文字編譯器,於是馬上下載了一個kindEditor來試試,但後來老大推薦說百度的ueditor編譯器不錯,於是我便懷著擴充套件知識,又學到一個新東西的心理下載了百度的ueidtor編譯器,整合到專案中感覺確實不錯,今天就和大家分享下這個富文字編譯器的使用…… 下載

Spring Boot參考教程配置下載

.net blog 不想 center src 默認 tps servlet odi 7.配置上傳下載 使用上傳下載的功能我們需要配置multipartResolver,先啟動工程,不做配置。 訪問端點/beans: Spring Boot默認實例化了一個Multip

JavaEE6——檔案下載

實驗6 檔案上傳下載 一、實驗目的 掌握通過Servlet實現檔案上傳下載功能; 重點掌握commons-fileupload.jar接收瀏覽器上傳檔案,實現上傳功能; 二、實驗注意事項 首先檔案上傳表單的資料也是被封裝到request物件中的。

Aery的UE4 C++遊戲開發5字元&字串

[toc] # TCHAR 字元 --- C++支援兩種字符集:即常見的ANSI編碼和寬字元的Unicode編碼,實際對應的字元型別分別是char和wchar_t,在不同平臺環境下,我們可能需要不同的字元型別。 TCHAR就是UE4通過對char和wchar_t的封裝,將其中的操作進行

iOS多線程開發GCD下篇

num 不能 每次 自定義 left void 類型 c函數 current 上篇和中篇講解了什麽是GCD,如何使用GCD,這篇文章將講解使用GCD中將遇到的死鎖問題。有興趣的朋友可以回顧《iOS多線程開發之GCD(上篇)》和《iOS多線程開發之GCD(中篇)》。

C/C++知識回爐 全棧c

hello printf 無敵 特殊 導致 span height world! 指向 c語言講義 指針的重要性,有人說學c語言,沒有學過指針就相當於沒有學過c語言,而我很不幸,大學時代就是,學了c語言,但是沒有學指針 1 //c語言中函數要先聲明 後使用 我們要

Android 開發 ---- bootloader LK

ttl tab 不同的 opera 指定 isa system void mem LK是什麽 LK 是 Little Kernel 它是 appsbl (Applications ARM Boot Loader)流程代碼 ,little kernel

ONVIF學習-ONVIF開發框架搭建C++

nts red port ice 框架搭建 代碼 nal tails 服務器 第一步、下載gsoap 從gsoap官網(http://www.genivia.com/products.html#notice)下載最新版gsoap(博主用的是gsoap_2.8.45

前端基於react,後端基於.net core2.0的開發1 介紹

tco ioc logs asp webpack 路由 src 部署 關鍵字 文章提綱目錄 1.前端基於react,後端基於.net core2.0的開發之路(1) 介紹 2.前端基於react,後端基於.net core2.0的開發之路(2) 開發環境的配置,

4.前端基於react,後端基於.net core2.0的開發4 前端打包,編譯,路由,模型,服務

hub 解決 路徑 export routes run 部署 service 後端 1.簡要的介紹 學習react,首先學習的就是javascript,然後ES6,接著是jsx,通常來說如果有javascript的基礎,上手非常快,但是真正要搭建一個前端工程化項目,還是有很

android開發Animation

protected html err nim package 設置圖 move 函數 star android開發之Animation的使用(五) 本博文主要講述的

python開發

數字 美團 其中 class 翻譯 電視 ... 硬件 算數運算 一、python基礎入門 1、編程語言 程序員與計算機溝通的語言就叫做編程語言 編程語言發展至今經歷了以下: ①.機器語言:站在計算機(奴隸)的角度,說計算機能聽懂的語言,那就是直接用二進制編程,直接操作

微信小程序後端開發總結~1C#

ali 存在 漢字轉換 返回 font con utf8 OS big 1.小程序端對於18位long類型的接收轉換會出錯,比如171106161246602821—> 171106161246602820。 例如:用戶表的主鍵id存的是18位的biglong類型的,