iT邦幫忙

0

讓用戶上傳 .csv 檔案時,希望限制 .csv 檔案中的資料筆數,該如何做?

  • 分享至 

  • xImage

請教大大!任何協助都將銘感於心。
我有一個 laravel 6.* 的項目,有個功能需求:讓客戶上傳 .csv 檔案,
上傳後我的laravel 會幫用戶發出簡訊,但我想限制用戶上傳的手機號筆數,以免讓系統負荷過重,請問我該怎麼做?
PS1: .csv 檔案中 只使用 A欄位,逐列填寫手機號碼(希望限制列數),
PS2:我最主要不會的地方是:拿到file後不知道怎麼計算檔案內容的筆數,ex:
在我的controller 的 方法中,如下:

    public function checkQty(Request $request, $act_id)
    {
		$user = $request->user();
		$act = Act::findOrFail($act_id);
        $file = $request->file;
        $limitQty = 1000;
        // 我希望這裡下判斷,但不會的就是這裡了!
        if ($file 的筆數 > $limitQty) {
            // 發簡訊
        } else {
            return redirect(url('/'))->with('flash_alert', '資料過多!');
        }
    }

前端能做到嗎?或者後端能做到嗎?衷心希望路過的大神指點迷津

看更多先前的討論...收起先前的討論...
先找出檔案總列數,在迴圈尋找有值A欄位那列,應該可以?
謝謝您的說明,但我比較欠缺的是語法該如何下?
David iT邦新手 5 級 ‧ 2021-12-01 16:11:37 檢舉
PHP 有個讀取 csv 的語法 "fgetcsv" 這個,讀出來應該就能算筆數了吧
非常謝謝您熱心提供,
我目前經人指引找到參考資料如下:
// 語法來源: https://www.geeksforgeeks.org/how-to-get-the-number-of-lines-in-a-file-using-php/?fbclid=IwAR0gAQ7U8SsGMMAUkyITUwmGaMeR9zmey9_RXchlSJC4pHafJ-fx8LbYjlA
$filePath = $request->file('excel_file');
$lineCount = 0;
$handleFile = fopen($filePath, "r");
while(!feof($handleFile)){
// We are loading only 4096 bytes of data at a time.
$line = fgets($handleFile, 4096);
// We are using PHP_EOL (PHP End of Line)
//to count number of line breaks in currently loaded data.
$lineCount = $lineCount + substr_count($line, PHP_EOL);
}
fclose($handleFile);
已經可以知道筆數
揮揮手 iT邦研究生 5 級 ‧ 2021-12-01 17:43:20 檢舉
好奇問一下 所以是 讀CSV系統撐不住
還是發送的時候系統撐不住
是發送的話 有想過寫批次??
我擔心的是讀 .csv 時以及發送時 兩者都可能撐不住,例如惡意用戶來個百萬筆之類
froce iT邦大師 1 級 ‧ 2021-12-02 08:45:44 檢舉
那限制容量大小就好,不只前端,後端應該也能看檔頭去擋。
前端要看mdb的筆數有點困難,csv或許有辦法。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
㊣浩瀚星空㊣
iT邦大神 1 級 ‧ 2021-12-01 13:35:58
最佳解答

簡單的做法給你參考

1.限制行數:基本來說只要看換行多少大約筆數就在那左右了。
2.限制容量:這招其實算最快的。你可以不用管筆數。畢竟檔案上傳就可以得到容量了。

不過一般並不建議傳檔就直接發。連返悔的機會都沒有。
正常的做法是上傳了先建立好資料。確定筆數及內容後。
再做發送的動作。這樣會比較安全。

看更多先前的回應...收起先前的回應...

謝謝星空大大,但是我必須要拿到筆數,因為發簡訊是依照數量計費的

所以你沒注意我後面說的話。
算了,等你發生事情就會懂了。

正規來說,你需要有CSV相關的解檔。一般大多數都是用EXCEL系列的。
這樣才可以得到正確的資料及筆數。
沒有的話,就得依照你的CSV格式來判斷。
大多數來說,依CSV來說,通常一個換行就是一筆資料。
所以可以用

    $datas = explode(PHP_EOL,$file);//依換行拆解成陣列
    $num = count($datas);//取得陣列數量

這是算比較簡單的方式。不過有些CSV有特別的換行關係。如用「;」做結束。
你要自行學會如果轉變。

如果要再多驗証資料的正確性。
是可以再跑一下FOREACH來做判斷處理。

大大的意思~不管任何上傳資料~都要先預覽~不可以直接發送簡訊~免得系統出包~
因為要先預覽~自然就可以預覽限制筆數~

感恩不盡,我受教了,但是由於技術基礎薄弱,我需要在自我加強學習一番如CSV相關的解檔...,才能做好我目前的工作,謝謝熱心指教

問題已解決 謝謝各位的指導

我要發表回答

立即登入回答