iT邦幫忙

0

當假如用 base64 上傳到 server 並且解碼之後~ 在 server 看到的資料卻是 0KB ~ 這會是哪個地方出問題了?

  • 分享至 

  • xImage

當假如用 base64 上傳到 server 並且解碼之後~
在 server 看到的資料卻是 0KB ~ 這會是哪個地方出問題了?

我的用法是這樣

function uploadFileChunk(fileData, uploadInfo, destinationDirectory) {
let reader = new FileReader();
  reader.onload = function () {
    var binaryData = reader.result;
    var base64String = window.btoa(binaryData);
    base64 = base64String;
    //console.log(base64);
    base64upload(base64);
  };
  reader["readAsDataURL"](fileData);
  
  function base64upload(base64) {
    if (fileData.name !== "" && base64 !== "") {
      //server
      let param = {
        FileName: "/var/www/html/sms_files/upload/" + fileData.name,
        Base64FileData: base64,
      };

      SmsApis.Upload.post
        .UploadFile(param)
        .then(function (xhr) {
          if (xhr.data.result[0] === "OK") {
            console.log("上傳成功");
          }
        })
        .catch(function (error) {});
    }
  }

我是有得到 base64 的編碼
然後 server 端也有解碼出來 所以才會有文件吧?
但是我到server查看的時候 卻發現檔案大小是 0KB
那會是哪個環節出了問題?

froce iT邦大師 1 級 ‧ 2021-07-15 14:51:36 檢舉
你要去server端看有沒有接到你的base64,有沒有正確解碼,有沒有存入磁碟...
只給前端code沒用。

然後都2021年了,好好用multipart不好嗎?何必用b64讓檔案變大還要耗時間解碼...
ping1000 iT邦新手 5 級 ‧ 2021-07-15 14:59:11 檢舉
沒辦法~ 公司要用 base64 上傳才可以~ 而且這是內網不對外~

另外 編碼出來要用哪一個? 哪一種才是正確的??
是有這樣開頭才是正確的嗎??
data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,
還是不用這個開頭的?

因為 var binaryData = reader.result 這一段開頭是有包含
var base64String = window.btoa(binaryData); 這個是就直接把前面給省略了

所以有可能是 server 端的問題了? 解碼沒有成功?
froce iT邦大師 1 級 ‧ 2021-07-15 15:19:03 檢舉
要去看server端怎麼寫,印象中要mime type的只有前端,因為你沒副檔名,瀏覽器不能猜你傳來的b64是什麼檔,後端要收只需要二進位檔就行了,window.btoa只是負責把檔案的二進位值轉成b64編碼的ascii值,server收到只要解回去,存回檔案就好。

那server端就很有可能要求的格式不太一樣,可能只要檔名和b64 string,也有可能要像你寫的html resource格式,這是要看server端實做的。

如果後端不是你負責的,那就是找後端的人給個接收範例...
至少要給個他收的格式才能溝通吧?

很久沒搞這種脫離標準的東西了...
b64這個小檔案還行,大檔案的話真的建議不要這樣玩。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1

想要用BASE64傳資料很好。
不過要小心容量限制問題。

一般的from-data的檔案上傳限制,在PHP可以額外開放。
所以大多可以上傳很大的容量。

而會轉成base64的情況。不外乎大多是利用GET或是POST傳送居多。
但GET傳送的容量很小。
POST大多會有限制基本容量了。就算開大了。也會有變數容量問題。

所以這也是為何很多前輩說,小檔案還可以。但大檔案就最好還是不要這樣玩。

回頭來回答你的問題。
大多數來說你接到的B64的值還原後變成0KB。
大多數就是收取編碼不完全,造成無法正確解碼而生成空值。
所以才會是0KB。

0
海綿寶寶
iT邦大神 1 級 ‧ 2021-07-15 17:04:11

Google這篇用 base64 上傳 image 檔的給你參考看看

0
sx0800
iT邦新手 1 級 ‧ 2021-07-16 21:43:30

再看一次你的碼 發現你是要圖檔轉base64, 我的碼並不適用,不過我找到了此資料:
https://stackoverflow.com/questions/10982712/convert-binary-data-to-base64-with-javascript

由我的碼裡抽出來的,你試看看。後端是 java 可以正常解開。
base64Encode: function(str) {
let ret = "";
if (str.length > 0) {
ret = btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {
return String.fromCharCode("0x" + p1);
}));
}
return ret;
},

我要發表回答

立即登入回答